Schwierigkeiten mit JWTBearer Authorization in ASP.NET Core Web API (.NET 5)

  • C# (ASP)

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Bartosz.

    Schwierigkeiten mit JWTBearer Authorization in ASP.NET Core Web API (.NET 5)

    Hallo zusammen,

    ich habe eine ASP.NET Core Web API in .NET 5 erstellt und arbeite gerade an der Implementierung der Autorisierung. Ich verwende dazu JWTBearer. Ich habe den ganzen Nachmittag damit verbracht, verschiedene Quellen zu durchsuchen und Videos anzusehen. Dabei ist mir aufgefallen, dass es immer wieder Unterschiede gibt – die in den Quellen beschriebenen oder gezeigten Objekte und Methoden werden vom Compiler nicht immer erkannt.

    Ich habe ein Video von Nick Chapsas gefunden, das speziell auf .NET 5 eingeht. Durch den im Video gezeigten Code wird der "Authorize"-Button im Swagger sichtbar, aber beim Versuch, mich einzuloggen, kann ich mich nur entweder sofort wieder ausloggen oder den Dialog abbrechen (wie im Bild zu sehen). Das Einloggen funktioniert nicht.


    Ein Unterschied zu dem Video ist, dass er ein Dictionary<string, IEnumerable<string>> erstellt hat und es als Argument in AddSecurityRequirement() verwendet hat. Diese Methode hat bei mir nicht funktioniert. Stattdessen habe ich den folgenden Code verwenden müssen:

    C#-Quellcode

    1. var temp = new OpenApiSecurityRequirement();
    2. var temp1 = new OpenApiSecurityScheme
    3. {
    4. Description = "JWT authorization header using the bearer scheme",
    5. Name = "Authorization",
    6. In = ParameterLocation.Header,
    7. Type = SecuritySchemeType.ApiKey
    8. };
    9. temp.Add(temp1, new List<string>());


    Hier einmal die komplette Startup.cs:

    C#-Quellcode

    1. using Identity;
    2. using Microsoft.AspNetCore.Authentication.JwtBearer;
    3. using Microsoft.AspNetCore.Builder;
    4. using Microsoft.AspNetCore.Hosting;
    5. using Microsoft.Extensions.Configuration;
    6. using Microsoft.Extensions.DependencyInjection;
    7. using Microsoft.Extensions.Hosting;
    8. using Microsoft.IdentityModel.Tokens;
    9. using Microsoft.OpenApi.Models;
    10. using System.Collections.Generic;
    11. namespace myNamespace
    12. {
    13. public class Startup
    14. {
    15. public Startup(IConfiguration configuration)
    16. {
    17. Configuration = configuration;
    18. }
    19. public IConfiguration Configuration { get; }
    20. // This method gets called by the runtime. Use this method to add services to the container.
    21. public void ConfigureServices(IServiceCollection services)
    22. {
    23. services.AddControllers();
    24. services.AddScoped<ManagementRepository.IManagement, ManagementRepository.Management>();
    25. services.AddHostedService<AccountRepository.AccountLoaderBackgroundService>();
    26. var jwtSettings = new JwtSettings();
    27. Configuration.Bind(nameof(jwtSettings), jwtSettings);
    28. services.AddSingleton(jwtSettings);
    29. services.AddAuthentication(x =>
    30. {
    31. x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    32. x.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
    33. x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    34. }).AddJwtBearer(x =>
    35. {
    36. x.SaveToken = true;
    37. x.TokenValidationParameters = new TokenValidationParameters
    38. {
    39. ValidateIssuerSigningKey = true,
    40. IssuerSigningKey = new SymmetricSecurityKey(System.Text.Encoding.ASCII.GetBytes(jwtSettings.Secret)),
    41. ValidateIssuer = false,
    42. ValidateAudience = false,
    43. RequireExpirationTime = false,
    44. ValidateLifetime = true
    45. };
    46. });
    47. services.AddSwaggerGen(c =>
    48. {
    49. c.SwaggerDoc("v1", new OpenApiInfo { Title = "myAPIName", Version = "v1" });
    50. //var security = new Dictionary<string, IEnumerable<string>>
    51. //{
    52. // {"Bearer", new string[0] }
    53. //};
    54. c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
    55. {
    56. Description = "JWT authorization header using the bearer scheme",
    57. Name = "Authorization",
    58. In = ParameterLocation.Header,
    59. Type = SecuritySchemeType.ApiKey
    60. });
    61. var temp = new OpenApiSecurityRequirement();
    62. var temp1 = new OpenApiSecurityScheme
    63. {
    64. Description = "JWT authorization header using the bearer scheme",
    65. Name = "Authorization",
    66. In = ParameterLocation.Header,
    67. Type = SecuritySchemeType.ApiKey
    68. };
    69. temp.Add(temp1, new List<string>());
    70. //temp.Add("Bearer", new List<string> { string.Empty });
    71. c.AddSecurityRequirement(temp);
    72. });
    73. }
    74. // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    75. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    76. {
    77. if (env.IsDevelopment())
    78. {
    79. app.UseDeveloperExceptionPage();
    80. app.UseSwagger();
    81. app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyApiName v1"));
    82. }
    83. app.UseHttpsRedirection();
    84. app.UseRouting();
    85. app.UseAuthentication();
    86. app.UseAuthorization();
    87. app.UseEndpoints(endpoints =>
    88. {
    89. endpoints.MapControllers();
    90. });
    91. }
    92. }
    93. }


    Und in AppSettings.json:
    ​"JwtSettings": { "Key": "MeinKey" },

    C#-Quellcode

    1. ​public class JwtSettings
    2. {
    3. public string Secret { get; set; }
    4. }
    Einen Fehler konnte ich bisher beheben. In der AppSettings.json muss die Variable genauso heißen wie die Property in der Klasse JwtSettings: "Secret". In Zeile 31 in der Startup.cs schreiben wir
    services.Configure<JwtSettings>(Configuration.GetSection("JwtSettings"));
    und in Zeile 45
    IssuerSigningKey = new SymmetricSecurityKey(System.Text.Encoding.ASCII.GetBytes(Configuration["JwtSettings:Secret"])),

    und dann ist der String nicht mehr NULL.

    Letzen Endes funktioniert das Einloggen dennoch nicht.
    Hallo,
    Erstmal vorweg, warum .NET5? Das ist nicht mehr im Support und unter .NET 6/7 ist die Implementierung ähnlich/gleich.
    Ein Problem liegt bei AddSecurityDefinition. Du gibst dem kein Schema mit - sollte mMn so aussehen

    C#-Quellcode

    1. options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
    2. {
    3. Name = "Authorization",
    4. Type = SecuritySchemeType.ApiKey,
    5. Scheme = "Bearer",
    6. BearerFormat = "JWT",
    7. In = ParameterLocation.Header,
    8. });


    Dann lässt sich dein AddSecurityRequirement verkürzen. Generell scheinst du hier ziemlich durcheinander gekommen zu sein. Ich kenne das Video von Nick nicht, aber OpenApiSecurityRequirement erbt von Dictionary und _ist_ somit auch ein Dictionary.

    C#-Quellcode

    1. options.AddSecurityRequirement(new OpenApiSecurityRequirement
    2. {
    3. {
    4. new OpenApiSecurityScheme
    5. {
    6. Reference = new OpenApiReference
    7. {
    8. Type = ReferenceType.SecurityScheme,
    9. Id = "Bearer"
    10. }
    11. },
    12. new string[] {}
    13. }
    14. });

    Diese Konfiguration reicht Swagger, damit du dich hier einloggen kannst.

    Bei Value musst du nur "Bearer JWT_TOKEN" (wobei JWT_TOKEN = von deinem Login-Mechanismus generierte Token ist) hinterlegen. Danach kannst du deine Endpunkte aufrufen, die Authorisierung benötigen.
    Das Problem mit deinen Settings hast du ja bereits selbst gelöst.
    Alternativ kann ich auch empfehlen, eine Software wie z.B. Postman zu verwenden, um deine API zu testen.
    Hallo @ISliceUrPanties,
    vielen Dank für deine Rückmeldung. Es sieht so aus, als würde das Einloggen jetzt funktionieren (siehe Bild).

    Allerdings erhalte ich eine 401 Unauthorized-Fehlermeldung, wenn ich die GET-Anfrage im Swagger ausführe. Hast du eine Idee, woran das liegen könnte?

    Vielen Dank im Voraus!

    [Authorize] habe ich einmal über public class HomeController : ControllerBase probiert und einmal über meiner Get-Methode public ActionResult xy(UInt64 personId)

    Bei Value musst du nur "Bearer JWT_TOKEN" (wobei JWT_TOKEN = von deinem Login-Mechanismus generierte Token ist) hinterlegen
    Woher bekomme ich den Token, wenn ich mich gerade erst einlogge?


    Übrigens habe ich mich für .NET 5 entschieden, da es mir noch am vertrautesten erscheint (naja relativ). Außerdem benötige ich für .NET 6 und 7 Visual Studio 2022, das ich von der Arbeit kenne und das mir zu langsam ist.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bartosz“ ()

    Du musst natürlich Endpunkte erstellen, die das Ein- und Ausloggen übernehmen. Beim Einloggen wird ein Token generiert, den du dann für die Dauer der Lebenszeit des Tokens verwenden kannst. Entweder erstellst du dafür z.B. einen Token-Controller, oder du nimmst eine Software wie z.B. Keycloak. Aber das dürfte aktuell mit Kanonen auf Spatzen schießen gleichkommen.
    Auf die Schnelle habe ich hier ein ziemlich gutes How-to gefunden, das prinzipiell alles grundlegend beleuchtet. Daran kannst du dich halten und wirst sehr schnell deine Erfolge haben.
    Hallo,
    ich habe noch einige Sachen eingebaut. Ich habe den Code von diesem GitHub-Profil genutzt.
    Ich hatte vorher, wie aus diesem Thread ersichtlich, schon Code zu JWT-Settings drin, daher habe ich den Klassennamen so belassen und das appsettings aus dem GitHub umbenannt. Außerdem sind bei mir kleine Änderungen zu finden. Meine Klasse für die User heißt nicht User, sondern Person.

    Ich habe einen POST-Endpoint zum Authentifizieren erstellt. Mithilfe von SoapUI schicke ich username und password ab und bekomme einen Token.

    Zum Problem
    Nachdem ich den Token im Swagger eingegeben habe, kann ich die anderen Endpoints nicht aufrufen. Ich bekomme Unauthorized 401.

    Ich hänge das Repository an, allerdings nur die dafür wichtigen Dateien. Vielleicht mag hier jemand drüberschauen und etwas aufräumen. Irgendwie hab ich den Eindruck, dass das zu viele Klassen sind.

    In der Startup.cs:

    Spoiler anzeigen

    C#-Quellcode

    1. using Microsoft.AspNetCore.Authentication.JwtBearer;
    2. using Microsoft.AspNetCore.Builder;
    3. using Microsoft.AspNetCore.Hosting;
    4. using Microsoft.Extensions.Configuration;
    5. using Microsoft.Extensions.DependencyInjection;
    6. using Microsoft.Extensions.Hosting;
    7. using Microsoft.IdentityModel.Tokens;
    8. using Microsoft.OpenApi.Models;
    9. namespace myNamespaceAPI
    10. {
    11. public class Startup
    12. {
    13. public Startup(IConfiguration configuration)
    14. {
    15. Configuration = configuration;
    16. }
    17. public IConfiguration Configuration { get; }
    18. // This method gets called by the runtime. Use this method to add services to the container.
    19. public void ConfigureServices(IServiceCollection services)
    20. {
    21. services.AddControllers();
    22. services.AddScoped<ManagementRepository.IManagement, ManagementRepository.Management>();
    23. services.AddSingleton<AccountRepository.IAccountSingletonService, AccountRepository.AccountSingletonService>();
    24. services.AddScoped<AccountRepository.IAccountScopedService, AccountRepository.AccountScopedService>();
    25. services.AddTransient<AccountRepository.IAcountTransientService, AccountRepository.AcountTransientService>();
    26. services.AddHostedService<AccountRepository.AccountLoaderBackgroundService>();
    27. services.AddHostedService<AccountRepository.AccountLoaderHostedService>();
    28. var jwtSettings = new AccountRepository.JwtSettings();
    29. services.Configure<AccountRepository.JwtSettings>(Configuration.GetSection("JwtSettings"));
    30. services.AddScoped<AccountRepository.IAuthenticationTools, AccountRepository.AuthenticationTools>();
    31. //services.AddSingleton(jwtSettings);
    32. services.AddAuthentication(x =>
    33. {
    34. x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    35. x.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
    36. x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    37. }).AddJwtBearer(x =>
    38. {
    39. x.SaveToken = true;
    40. x.TokenValidationParameters = new TokenValidationParameters
    41. {
    42. ValidateIssuerSigningKey = true,
    43. IssuerSigningKey = new SymmetricSecurityKey(System.Text.Encoding.ASCII.GetBytes(Configuration["JwtSettings:Secret"])),
    44. ValidateIssuer = false,
    45. ValidateAudience = false,
    46. RequireExpirationTime = false,
    47. ValidateLifetime = true
    48. };
    49. });
    50. services.AddSwaggerGen(c =>
    51. {
    52. c.SwaggerDoc("v1", new OpenApiInfo { Title = "title", Version = "v1" });
    53. c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
    54. {
    55. Name = "Authorization",
    56. Type = SecuritySchemeType.ApiKey,
    57. Scheme = "Bearer",
    58. BearerFormat = "JWT",
    59. In = ParameterLocation.Header,
    60. });
    61. c.AddSecurityRequirement(new OpenApiSecurityRequirement
    62. {
    63. {
    64. new OpenApiSecurityScheme
    65. {
    66. Reference = new OpenApiReference
    67. {
    68. Type = ReferenceType.SecurityScheme,
    69. Id = "Bearer"
    70. }
    71. },
    72. System.Array.Empty<string>()
    73. }
    74. });
    75. });
    76. }
    77. // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    78. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    79. {
    80. if (env.IsDevelopment())
    81. {
    82. app.UseDeveloperExceptionPage();
    83. app.UseSwagger();
    84. app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "myNamespaceAPI v1"));
    85. }
    86. app.UseHttpsRedirection();
    87. app.UseRouting();
    88. app.UseAuthentication();
    89. app.UseAuthorization();
    90. app.UseMiddleware<AccountRepository.JwtMiddleware>();
    91. app.UseEndpoints(endpoints =>
    92. {
    93. endpoints.MapControllers();
    94. });
    95. }
    96. }
    97. }



    Im Controller

    Spoiler anzeigen

    C#-Quellcode

    1. #pragma warning disable IDE0049
    2. using ManagementRepository;
    3. using Microsoft.AspNetCore.Authorization;
    4. using Microsoft.AspNetCore.Mvc;
    5. using System;
    6. namespace myNamespace.Controllers
    7. {
    8. [Route("api/[controller]")]
    9. [ApiController]
    10. //[Authorize]
    11. public class HomeController : ControllerBase
    12. {
    13. private readonly IManagement Manager;
    14. private readonly AccountRepository.IAuthenticationTools _IAuthenticationTools;
    15. public HomeController(IManagement manager, AccountRepository.IAuthenticationTools iAuthenticationTools)
    16. {
    17. this.Manager = manager;
    18. this._IAuthenticationTools = iAuthenticationTools;
    19. }
    20. [Authorize]
    21. [HttpGet("{...}/...")]
    22. public ActionResult someThings(UInt64 personId)
    23. {
    24. }
    25. // POST: /api/Home/authenticate
    26. [HttpPost("authenticate")]
    27. public IActionResult Authenticate(AccountRepository.AuthenticateRequest model)
    28. {
    29. var response = _IAuthenticationTools.Authenticate(model);
    30. if (response == null)
    31. return BadRequest(new { message = "Username or password is incorrect" });
    32. return Ok(response);
    33. }
    34. }
    35. }

    Dateien
    Hallo @ISliceUrPanties,
    könntest du bitte einmal rüberschauen? Ich habe ein Tutorial gefunden und abgearbeitet. Zur Tokengenerierung habe ich einen Endpunkt genutzt. Nach Erhalt des Tokens mit SoapUI und Eingabe des Tokens bekomme ich vom Endpunkt someThings immer noch 401 zurück. Ich denke, in der Startup.cs oder in den anderen Dateien des Repos habe ich einen kleinen (Tipp-)Fehler gemacht.
    Viele Grüße
    Bartosz
    Hallo,
    vom groben drüberschauen deiner Startup.cs fällt mir auf, dass dir der Aufruf von services.AddAuthorization() nach AddAuthentication fehlt.
    Ich habe mal ein einfaches Demo-Projekt zum Vergleichen mit angefügt. Vielleicht kannst du da ja noch ein paar Erkenntnisse mitnehmen.
    Dateien
    Hi @ISliceUrPanties es geht leider immer noch nicht. Das Holen des Tokens klappt. Rufe ich GET SomeThings auf, bekomme ich 401.
    startup.cs
    Spoiler anzeigen

    C#-Quellcode

    1. using Microsoft.AspNetCore.Authentication.JwtBearer;
    2. using Microsoft.AspNetCore.Builder;
    3. using Microsoft.AspNetCore.Hosting;
    4. using Microsoft.Extensions.Configuration;
    5. using Microsoft.Extensions.DependencyInjection;
    6. using Microsoft.Extensions.Hosting;
    7. using Microsoft.IdentityModel.Tokens;
    8. using Microsoft.OpenApi.Models;
    9. namespace MyNamespace
    10. {
    11. public class Startup
    12. {
    13. public Startup(IConfiguration configuration)
    14. {
    15. Configuration = configuration;
    16. }
    17. public IConfiguration Configuration { get; }
    18. // This method gets called by the runtime. Use this method to add services to the container.
    19. public void ConfigureServices(IServiceCollection services)
    20. {
    21. services.AddControllers();
    22. services.AddScoped<ManagementRepository.IManagement, ManagementRepository.Management>();
    23. services.AddSingleton<AccountRepository.IAccountSingletonService, AccountRepository.AccountSingletonService>();
    24. services.AddScoped<AccountRepository.IAccountScopedService, AccountRepository.AccountScopedService>();
    25. services.AddTransient<AccountRepository.IAcountTransientService, AccountRepository.AcountTransientService>();
    26. services.AddHostedService<AccountRepository.AccountLoaderBackgroundService>();
    27. services.AddHostedService<AccountRepository.AccountLoaderHostedService>();
    28. services.AddSwaggerGen(options =>
    29. {
    30. options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
    31. {
    32. Name = "Authorization",
    33. Type = SecuritySchemeType.ApiKey,
    34. Scheme = "Bearer",
    35. BearerFormat = "JWT",
    36. In = ParameterLocation.Header,
    37. });
    38. options.AddSecurityRequirement(new OpenApiSecurityRequirement
    39. {
    40. {
    41. new OpenApiSecurityScheme
    42. {
    43. Reference = new OpenApiReference
    44. {
    45. Type = ReferenceType.SecurityScheme,
    46. Id = "Bearer"
    47. }
    48. },
    49. System.Array.Empty<string>()
    50. }
    51. });
    52. });
    53. services.AddAuthentication(x =>
    54. {
    55. x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    56. x.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
    57. x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    58. }).AddJwtBearer(x =>
    59. {
    60. x.SaveToken = true;
    61. x.TokenValidationParameters = new TokenValidationParameters
    62. {
    63. ValidateIssuerSigningKey = true,
    64. IssuerSigningKey = new SymmetricSecurityKey(System.Text.Encoding.ASCII.GetBytes(Configuration["Jwt:Key"])),
    65. ValidateIssuer = false,
    66. ValidateAudience = false,
    67. RequireExpirationTime = false,
    68. ValidateLifetime = true
    69. };
    70. });
    71. services.AddAuthorization();
    72. } //public void ConfigureServices
    73. // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    74. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    75. {
    76. if (env.IsDevelopment())
    77. {
    78. app.UseDeveloperExceptionPage();
    79. app.UseSwagger();
    80. app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyNamespace v1"));
    81. }
    82. app.UseHttpsRedirection();
    83. app.UseRouting();
    84. app.UseAuthentication();
    85. app.UseAuthorization();
    86. app.UseEndpoints(endpoints =>
    87. {
    88. endpoints.MapControllers();
    89. });
    90. }
    91. }
    92. }




    HomeController.cs
    Spoiler anzeigen

    C#-Quellcode

    1. #pragma warning disable IDE0049
    2. using AccountRepository;
    3. using ManagementRepository;
    4. using Microsoft.AspNetCore.Authorization;
    5. using Microsoft.AspNetCore.Http;
    6. using Microsoft.AspNetCore.Mvc;
    7. using Microsoft.IdentityModel.Tokens;
    8. using System;
    9. using System.IdentityModel.Tokens.Jwt;
    10. using System.Security.Claims;
    11. using System.Text;
    12. using Microsoft.Extensions.Configuration;
    13. namespace MyNamespace.Controllers
    14. {
    15. [Route("api/[controller]")]
    16. [ApiController]
    17. //[Authorize]
    18. public class HomeController : ControllerBase
    19. {
    20. private readonly IManagement Manager;
    21. private readonly IConfiguration _configuration;
    22. public HomeController(IManagement manager, IConfiguration configuration)
    23. {
    24. this.Manager = manager;
    25. this._configuration = configuration;
    26. }
    27. [Authorize]
    28. [ProducesResponseType(StatusCodes.Status200OK)]
    29. [ProducesResponseType(StatusCodes.Status401Unauthorized)]
    30. // GET: /api/Home/bla
    31. [HttpGet("{ID}/bla")]
    32. public ActionResult SomeThings(UInt64 personId)
    33. {
    34. }
    35. [AllowAnonymous]
    36. [HttpPost("authenticate")]
    37. public string Authenticate([FromBody] Person user)
    38. {
    39. // TODO: Check User (DB, other Auth)
    40. string issuer = _configuration["Jwt:Issuer"]!;
    41. string audience = _configuration["Jwt:Audience"]!;
    42. byte[] key = Encoding.ASCII.GetBytes(_configuration["Jwt:Key"]!);
    43. SecurityTokenDescriptor tokenDescriptor = new()
    44. {
    45. Subject = new ClaimsIdentity(new[]
    46. {
    47. new Claim("Id", Guid.NewGuid().ToString()),
    48. new Claim(JwtRegisteredClaimNames.GivenName, user.FirstName),
    49. new Claim(JwtRegisteredClaimNames.Email, user.EMail),
    50. new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
    51. }),
    52. Expires = DateTime.UtcNow.AddMinutes(5),
    53. Issuer = issuer,
    54. Audience = audience,
    55. SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha512Signature)
    56. };
    57. JwtSecurityTokenHandler tokenHandler = new();
    58. SecurityToken token = tokenHandler.CreateToken(tokenDescriptor);
    59. return tokenHandler.WriteToken(token);
    60. }
    61. }
    62. }
    63. #pragma warning restore IDE0049



    Aufruf mit SoapUI zum Token holen ist mittels JSON:

    JSON-Quellcode

    1. {
    2. "FirstName": "meinVorname",
    3. "EMail": "meineEmail"
    4. }

    Willst du mal ein Bild von den Request Headers schicken, die Swagger bei deiner Anfrage erstellt, damit wir sehen können, ob das Token auch richtig mitgegeben wird?
    ----

    WebApps mit C#: Blazor
    @florian03 Ich hab bisher im Swagger auf "Try it out" und "Execute" geklickt.
    Ich kenns so von der Arbeit. Wenn das in meiner Umsetzung falsch ist, ok, verstehe ich. Aber ich dachte, damit läuft's.



    Curl sieht so aus (ja, mein Token ist sehr lang :D ) :

    Quellcode

    1. curl -X GET "https://localhost:44318/api/Home/meineRoute" -H "accept: */*" -H "Authorization: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJJZCI6ImZhOTA4OTdkLWU2ZTAtNDVhMC05MzdiLTM1NzRiMTRhMjNmZSIsImdpdmVuX25hbWUiOiJCaXJnZXIiLCJlbWFpbCI6IkIuSG9sdGthbXA5MUB3ZWIuZGUiLCJqdGkiOiJiN2E1ZTg0ZC1jYzkzLTRiYjctYjYwYS04MmI4NTE1NmY5ZTYiLCJuYmYiOjE2OTU4MzAzMzksImV4cCI6MTY5NTgzMDYzOSwiaWF0IjoxNjk1ODMwMzM5LCJpc3MiOiJNeUhvc3QiLCJhdWQiOiJNeUF1ZGllbmNlIn0.iDY7r6x5l3fByVJHHfYQc6qIhk0IEyPhQdSxJPasVaX5lUKViR1O-T6gPF2jKmF_8L-A84DKBzEmbM1ZWXc_Ww"
    Hmm, wenn ich mir deinen Curry Befehl anschaue, glaube ich, dass in dem Header bei Authorization "Bearer" fehlt.

    Versuche mal, wenn du das Token bei Swagger eingibst, in die Textbox ​Bearer [TOKEN] zu schreiben, anstatt nur das Token.
    Dann sollte es funktionieren.

    Grüße
    Florian
    ----

    WebApps mit C#: Blazor