Поделиться через


События безопасности возвращают маркер JsonWebToken

События JwtBearerEvents, WsFederationEvents и OpenIdConnectEvents — это события проверки подлинности, которые активируются обработчиками проверок подлинности JwtBearer, WsFederation и OpenIdConnect. Например, OnTokenValidated событие запускается при проверке маркера безопасности. Эти события запускаются с помощью контекста (например, TokenValidatedContext), который предоставляет TokenValidatedContext.SecurityToken свойство абстрактного типа SecurityToken. Реализация по умолчанию изменена с TokenValidatedContext.SecurityToken на JwtSecurityToken.

Представленная версия

ASP.NET Core 8.0 (предварительная версия 7)

Предыдущее поведение

Ранее затронутые SecurityToken свойства были реализованы классом JwtSecurityToken, который наследуется от SecurityToken. JwtSecurityToken — это предыдущее поколение реализации веб-токена JSON (JWT). Маркеры JwtSecurityToken были созданы SecurityTokenValidators.

Кроме того, JwtSecurityTokenHandler.DefaultInboundClaimTypeMap поле предоставило сопоставление типов утверждений по умолчанию для входящих утверждений.

Новое поведение

Начиная с ASP.NET Core 8.0, класс, Microsoft.IdentityModel.JsonWebTokens который также является производным от SecurityToken, реализует SecurityToken свойства по умолчанию. Microsoft.IdentityModel.JsonWebTokens токены создаются более оптимизированными TokenHandler обработчиками.

Кроме того, поле JsonWebTokenHandler.DefaultInboundClaimTypeMap предоставляет сопоставление типов утверждений по умолчанию для входящих утверждений.

Тип разрушающего изменения

Это изменение поведения.

Причина изменения

Это изменение было сделано потому, что JsonWebToken (и связанные с ним JsonWebTokenHandler) приносят следующие преимущества:

  • 30% улучшение производительности.
  • Улучшение надежности за счет использования метаданных в последнем известном корректном состоянии (например, OpenIdConnectMetadata).
  • Асинхронная обработка.

Для большинства пользователей это изменение не должно быть проблемой, так как тип свойств (SecurityToken) не изменился, и вы не должны были смотреть на реальный тип.

Однако если вы выполнили приведение к одному из затронутых SecurityToken свойств JwtSecurityToken (например, чтобы получить утверждения), у вас есть два варианта:

  • Приведение свойства вниз к JsonWebToken:

    service.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, options => {
        options.Events.OnTokenValidated = (context) => {
            // Replace your cast to JwtSecurityToken.
            JsonWebToken token = context.SecurityToken as JsonWebToken;
            // Do something ...
        };
    });
    
  • Установите одно из логических свойств UseSecurityTokenValidators для соответствующих параметров (JwtBearerOptions, WsFederationOptions, или OpenIdConnectOptions) в значение true. Задав свойству значение true, обработчики проверки подлинности будут продолжать использовать JwtTokenValidators и продолжать производить токены JwtSecurityToken.

    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 ...
        };
    });
    

Затронутые API