セキュリティ トークン イベントが JsonWebToken を返す

JwtBearerEventsWsFederationEventsOpenIdConnectEvents イベントは、それぞれ、JwtBearerWsFederationOpenIdConnect 認証ハンドラーによって発生する認証イベントです。 たとえば、セキュリティ トークンが検証されると、OnTokenValidated イベントが発生します。 これらのイベントは、抽象型 SecurityTokenTokenValidatedContext.SecurityToken プロパティを公開するコンテキスト (たとえば、TokenValidatedContext) で発生します。 TokenValidatedContext.SecurityToken の既定の実際の実装が JwtSecurityToken から JsonWebToken に変更されました。

導入されたバージョン

ASP.NET Core 8.0 Preview 7

以前の動作

以前は、影響を受ける SecurityToken プロパティは、SecurityToken から派生した JwtSecurityToken によって実装されていました。 JwtSecurityToken は、JSON Web トークン (JWT) 実装の前の世代です。 JwtSecurityToken トークンは SecurityTokenValidators によって生成されていました。

さらに、JwtSecurityTokenHandler.DefaultInboundClaimTypeMap フィールドにより、受信要求の既定の要求の種類のマッピングが提供されました。

新しい動作

ASP.NET Core 8.0 以降では、同じく SecurityToken から派生した Microsoft.IdentityModel.JsonWebTokens クラスが、既定で SecurityToken プロパティを実装します。 Microsoft.IdentityModel.JsonWebTokens トークンは、より最適化された TokenHandler ハンドラーによって生成されます。

さらに、JsonWebTokenHandler.DefaultInboundClaimTypeMap フィールドにより、受信要求の既定の要求の種類マッピングが提供されます。

破壊的変更の種類

この変更は、動作変更です。

変更理由

この変更は、JsonWebToken (およびそれに関連する JsonWebTokenHandler) では、次の利点があるために行われました。

  • 30% のパフォーマンス向上。
  • "前回正常起動時" のメタデータ (OpenIdConnectMetadata など) の使用による信頼性の向上。
  • 非同期処理。

プロパティの型 (SecurityToken) は変更されておらず、実際の型を確認する必要はないはずなので、ほとんどのユーザーにとって、この変更は問題になりません。

ただし、影響を受ける SecurityToken プロパティの 1 つを JwtSecurityToken にダウンキャスト (たとえば、要求を取得するため) している場合は、次の 2 つのオプションがあります。

  • プロパティを JsonWebToken にダウンキャストします。

    service.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, options => {
        options.Events.OnTokenValidated = (context) => {
            // Replace your cast to JwtSecurityToken.
            JsonWebToken token = context.SecurityToken as JsonWebToken;
            // Do something ...
        };
    });
    
  • 対応するオプション (JwtBearerOptionsWsFederationOptions、または OpenIdConnectOptions) の UseSecurityTokenValidators ブール型プロパティの 1 つを 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