Udostępnij przez


Wydarzenia związane z tokenem bezpieczeństwa zwracają token JWT (JsonWebToken)

Zdarzenia JwtBearerEvents, WsFederationEventsi OpenIdConnectEvents to zdarzenia uwierzytelniania wyzwalane odpowiednio przez programy obsługi uwierzytelniania JwtBearer, WsFederation i OpenIdConnect . Na przykład OnTokenValidated zdarzenie jest uruchamiane po zweryfikowaniu tokenu zabezpieczającego. Te zdarzenia są wyzwalane przy użyciu kontekstu (na przykład TokenValidatedContext), który uwidacznia właściwość TokenValidatedContext.SecurityToken typu abstrakcyjnego SecurityToken. Domyślna rzeczywista implementacja została zmieniona z TokenValidatedContext.SecurityToken na System.IdentityModel.Tokens.Jwt.JwtSecurityToken.

Wersja wprowadzona

ASP.NET Core 8.0 (wersja zapoznawcza 7)

Poprzednie zachowanie

Wcześniej właściwości, których dotyczy problem SecurityToken, zostały zaimplementowane przez element System.IdentityModel.Tokens.Jwt.JwtSecurityToken, który pochodzi z klasy SecurityToken. JwtSecurityToken jest poprzednią generacją implementacji tokenu internetowego JSON (JWT). Tokeny JwtSecurityToken zostały wygenerowane przez program SecurityTokenValidators.

Ponadto JwtSecurityTokenHandler.DefaultInboundClaimTypeMap pole dostarczyło domyślne mapowanie typu oświadczenia dla oświadczeń przychodzących.

Nowe zachowanie

Począwszy od ASP.NET Core 8.0, Microsoft.IdentityModel.JsonWebTokens klasa, która również pochodzi z SecurityToken, implementuje SecurityToken właściwości domyślnie. Microsoft.IdentityModel.JsonWebTokens tokeny są generowane przez bardziej zoptymalizowane TokenHandler procedury obsługi.

Ponadto JsonWebTokenHandler.DefaultInboundClaimTypeMap pole zawiera domyślne mapowanie typu oświadczenia dla oświadczeń przychodzących.

Typ zmiany przełamującej

Ta zmiana jest zmianą behawioralną.

Przyczyna zmiany

Ta zmiana została wprowadzona, ponieważ JsonWebToken (i skojarzone z JsonWebTokenHandler) przynoszą następujące korzyści:

  • Poprawa wydajności o 30%.
  • Niezawodność została poprawiona dzięki wykorzystaniu metadanych ostatniego dobrego stanu (na przykład OpenIdConnectMetadata).
  • Przetwarzanie asynchroniczne.

W przypadku większości użytkowników ta zmiana nie powinna być problemem, ponieważ typ właściwości (SecurityToken) nie uległ zmianie i nie należało przyjrzeć się rzeczywistemu typowi.

Jednakże, jeśli jedna z dotkniętych SecurityToken właściwości była rzutowana w dół na JwtSecurityToken (na przykład, aby uzyskać roszczenia), masz dwie opcje:

  • Rzutowanie właściwości w dół na JsonWebToken:

    service.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, options => {
        options.Events.OnTokenValidated = (context) => {
            // Replace your cast to JwtSecurityToken.
            JsonWebToken token = context.SecurityToken as JsonWebToken;
            // Do something ...
        };
    });
    
  • Ustaw jedną z właściwości logicznych opcji (UseSecurityTokenValidators, JwtBearerOptions lub WsFederationOptions) na wartość OpenIdConnectOptions. Ustawiając właściwość na true, programy obsługi uwierzytelniania będą nadal używać JwtTokenValidators i będą nadal tworzyć JwtSecurityToken tokeny.

    service.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme,  options => {
        options.UseSecurityTokenValidators = true;
        options.Events.OnTokenValidated = (context) => {
            // As you were doing before
            JwtSecurityToken token = context.SecurityToken as JwtSecurityToken;
            // Do something ...
        };
    });
    

Interfejsy API, których dotyczy problem