Pytanie Walidacja JWT programu ASP.NET Core 2.0 kończy się niepowodzeniem z błędem `Autoryzacja nie powiodła się dla użytkownika: (null)`


Korzystam z aplikacji ASP.NET Core 2.0 (Web API) jako wydawcy JWT w celu wygenerowania tokena zużywalnego przez aplikację mobilną. Niestety ten token nie może zostać sprawdzony przez jeden kontroler, a może zostać zweryfikowany przez inny (przy użyciu tego samego ustawienia sprawdzania poprawności w ramach tej samej aplikacji core asp.net core 2.0).

Mam więc token, który jest ważny i może być odkodowany, ma wszystkie wymagane roszczenia i znaczniki czasu. Ale jeden punkt końcowy to akceptuje, podczas gdy inny daje mi błąd 401 i wynik debugowania:

Microsoft.AspNetCore.Authorization.DefaultAuthorizationService: Informacje:   Autoryzacja nie powiodła się dla użytkownika: (null).

[40m[32minfo[39m[22m[49m: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2]
      Authorization failed for user: (null).
Microsoft.AspNetCore.Authorization.DefaultAuthorizationService:Information: Authorization failed for user: (null).
[40m[32minfo[39m[22m[49m: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[3]
      Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter'.
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter'.
Microsoft.AspNetCore.Mvc.ChallengeResult:Information: Executing ChallengeResult with authentication schemes ().
[40m[32minfo[39m[22m[49m: Microsoft.AspNetCore.Mvc.ChallengeResult[1]
      Executing ChallengeResult with authentication schemes ().
[40m[32minfo[39m[22m[49m: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler[12]
      AuthenticationScheme: Bearer was challenged.
Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler:Information: AuthenticationScheme: Bearer was challenged.
[40m[32minfo[39m[22m[49m: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
      Executed action MyController.Get (WebApi) in 72.105ms
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executed action MyController.Get (WebApi) in 72.105ms
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request finished in 271.077ms 401 
[40m[32minfo[39m[22m[49m: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 271.077ms 401 

Moja konfiguracja sprawdzania poprawności znajduje się poniżej:

var secretKey = Configuration["Authentication:OAuth:IssuerSigningKey"];
var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(secretKey));
var tokenValidationParameters = new TokenValidationParameters
{
   ValidateIssuerSigningKey = true,
   IssuerSigningKey = signingKey,
   ValidateIssuer = true,
   ValidIssuer = Configuration["Authentication:OAuth:Issuer"],
   ValidateAudience = true,
   ValidAudience = Configuration["Authentication:OAuth:Audience"],
   ValidateLifetime = true,
   ClockSkew = TimeSpan.Zero,
};

services.AddAuthentication(options =>
{
   options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
   options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
   options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
    options.RequireHttpsMetadata = false;
    options.TokenValidationParameters = tokenValidationParameters;
});

Te dwa punkty końcowe są identyczne, po prostu żyj w różnych kontrolerach, obydwa oznaczone symbolem Authorize atrybut.

Jak to możliwe?


20
2017-08-22 01:56


pochodzenie




Odpowiedzi:


Ważna jest sekwencja instrukcji add w funkcji configure. Upewnij się, że

app.UseAuthentication();

nadchodzi wcześniej

app.UseMvc();

Czy to może być problem?


23
2017-10-23 13:17



To działało dla mnie. Dzięki! - amaleemur


W Twojej startup.cs Metoda ConfigureServices, jeśli dodasz

services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(options => ...

Wyjaśnienie: Kiedy używasz [Autoryzować] na kontrolerze domyślnie wiąże się z pierwszym systemem autoryzacji.

options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;

W ten sposób ustawiasz domyślne uwierzytelnianie na okaziciela JWT.

dodatkowo możesz dodać

options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;

linia ta polega na tym, jak zapobiegać otrzymywaniu błędów 404 podczas wykrywania tożsamości z JTT. Jeśli używasz tożsamości, DefaultChallengeScheme spróbuje przekierować cię do strony logowania, która jeśli nie istnieje, spowoduje, że 404 nie zostanie znalezione, a nie 401 nieautoryzowane. poprzez ustawienie DefaultChallengeScheme na JwtBearerDefaults.AuthenticationScheme na nieautoryzowane, nie będzie już próbował przekierować cię do strony logowania

Jeśli używasz uwierzytelniania plików cookie z uwierzytelnianiem JWT w [Autoryzować] możesz określić, jakie uwierzytelnienie chcesz wybrać. na przykład

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]

5
2018-02-20 17:10



czy możesz wyjaśnić, co się tutaj dzieje: stackoverflow.com/questions/51263883 . Mój pracuje tylko z [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] - ahmad molaie


spróbuj tego w pliku startup.cs

services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        }).AddJwtBearer(opts => ...

2
2017-10-10 05:30





Dodałem:

app.UseAuthentication();

W Startup.Configure() i to rozwiązało dla mnie ten błąd.

Odniesienie: Auth 2.0 Ogłoszenie o migracji


2
2017-10-20 15:57





Wydaje się, że to zachowanie, które otrzymujesz, gdy Twoje JWT nie jest poprawnie zatwierdzone. Miałem ten problem w wyniku wpisania "Nośnika: (JWT)" zamiast nagłówka "Nosiciel (JWT)" w nagłówku


0
2018-02-10 21:17





Zamiast tego możesz spróbować tego:

.AddJwtBearer(options =>
{
    AutomaticAuthenticate = true,
    AutomaticChallenge = true,
    options.RequireHttpsMetadata = false;
    options.TokenValidationParameters = tokenValidationParameters;
});'

-2
2017-08-22 06:49



Jestem pewien, że to nie zadziała. Od wersji 2.0 "AutomaticAuthenticate" i "AutomaticChallenge" są usuwane z JwtBearerOptions. czytaj tutaj: docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/... - da_elysian_fields
Tak, został usunięty, a teraz został zastąpiony przez defaultAuthenticateScheme i defaultChallengeScheme. - Alexey Strakh
@AlexeyStrakh rozwiązałeś to? - dzeki