共用方式為


安全性權杖事件會傳回 JsonWebToken

JwtBearerEventsWsFederationEventsOpenIdConnectEvents 事件分別是由 JwtBearerWsFederationOpenIdConnect 驗證處理常式引發的驗證事件。 例如,OnTokenValidated 事件會在驗證安全性權杖時引發。 這些事件會以公開抽象類型 SecurityTokenTokenValidatedContext.SecurityToken 屬性的內容 (例如 TokenValidatedContext) 引發。 TokenValidatedContext.SecurityToken 的預設實際實作已從 JwtSecurityToken 變更為 JsonWebToken

導入的版本

ASP.NET Core 8.0 Preview 7

先前的行為

先前,受影響的 SecurityToken 屬性是由 JwtSecurityToken 實作,其衍生自 SecurityTokenJwtSecurityToken 是前一代的 JSON Web Token (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 ...
        };
    });
    
  • 將對應選項 (JwtBearerOptionsWsFederationOptionsOpenIdConnectOptions) 上的其中一個 UseSecurityTokenValidators 布林值屬性設定為 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