簡體   English   中英

承載錯誤 - invalid_token - 未找到簽名密鑰

[英]Bearer error - invalid_token - The signature key was not found

我有一個 Angular 7 應用程序與 a.Net Core 2.2 API 后端接口。 這是與 Azure Active Directory 的接口。

在 Angular 7 方面,它正在使用 AAD 正確進行身份驗證,並且我得到了一個有效的 JWT 回來,如jwt.Z1F9771410D9D5F5F上驗證的那樣

在.Net Core API 方面,我創建了一個簡單的測試 API,上面有[Authorize]

當我從 Angular 調用此方法時,在添加承載令牌后,我得到(如 Chrome 調試工具、網絡選項卡、“標題”中所示):

WWW-Authenticate: Bearer error="invalid_token", error_description="找不到簽名密鑰"

使用HTTP/1.1 401 Unauthorized

簡單的測試 API 是:

    [Route("Secure")]
    [Authorize]
    public IActionResult Secure() => Ok("Secure works");

Angular 調用代碼也很簡單:

    let params : any = {
        responseType: 'text',
        headers: new HttpHeaders({
            "Authorization": "Bearer " + token,
            "Content-Type": "application/json"
        })
    }

    this.http
        .get("https://localhost:5001/api/azureauth/secure", params)
        .subscribe(
            data => { },
            error => { console.error(error); }
        );

如果我刪除[Authorize]屬性並將其作為來自 Angular 的標准GET請求調用它就可以正常工作

我的 Startup.cs 包含:

        services
            .AddAuthentication(AzureADDefaults.AuthenticationScheme)
            .AddAzureADBearer(options => this.Configuration.Bind("AzureAd", options));

這些選項都在 appsettings.json 中正確設置(例如 ClientId、TenantId 等),並且此處的options按預期填充。

我面臨着同樣的問題。 我缺少權限..確保權限和 api 名稱正確現在啟動文件中配置服務中的此代碼對我有用:

services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
                .AddIdentityServerAuthentication( x =>
                {
                    x.Authority = "http://localhost:5000"; //idp address
                    x.RequireHttpsMetadata = false;
                    x.ApiName = "api2"; //api name
                });

我有一個獨特的場景,希望這會對某人有所幫助。

我正在構建一個 API,它啟用了 Windows 協商身份驗證(.NET Core 5.0,從 IIS 運行)並單元測試 API 使用CustomWebApplicationFactory身份驗證( 請參閱不支持使用 CustomWebApplicationFactory 的 CustomWebApplicationFactory 的文檔)。

出於單元測試的目的,我告訴CustomWebApplicationFactory使用“UnitTest”環境( ASPNETCORE_ENVIRONMENT變量),並專門將邏輯編碼到我的應用程序 Startup.cs 文件中,以便僅為“UnitTest”環境添加 JWT 身份驗證。

我遇到了這個錯誤,因為我的 Startup.cs 配置沒有我用來創建令牌的簽名密鑰(下面的IssuerSigningKey )。

if (_env.IsEnvironment("UnitTest"))
{
  // for unit testing, use a mocked up JWT auth, so claims can be overridden
  // for testing specific authentication scenarios
  services.AddAuthentication()
    .AddJwtBearer("UnitTestAuth", opt =>
    {
      opt.Audience = "api://local-unit-test";
      opt.RequireHttpsMetadata = false;
      opt.TokenValidationParameters = new TokenValidationParameters()
      {
        ClockSkew = TokenValidationParameters.DefaultClockSkew,
        ValidateAudience = true,
        ValidateIssuer = true,
        ValidateIssuerSigningKey = true,
        ValidAudience = "api://local-unit-test",
        ValidIssuer = "unit-test",
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("abcdefghijklmnopqrstuvwxyz123456"))
      };
    });
} else {
  // Negotiate configuration here...
}

無論ValidateIssuerSigningKeytrue還是false ,我仍然收到“invalid_token”401 響應,與 OP 相同。 我什至嘗試指定一個自定義IssuerSigningKeyValidator委托來始終覆蓋結果,但也沒有運氣。

WWW-Authenticate: Bearer error="invalid_token", error_description="找不到簽名密鑰"

當我將IssuerSigningKey添加到TokenValidationParameters object (當然匹配我在單元測試中生成令牌時使用的密鑰)時,一切都按預期工作。

可能有兩個原因:

  1. 您可能錯過了注冊服務:
services.AddAuthorization(auth =>
            {
                auth.AddPolicy("Bearer", new AuthorizationPolicyBuilder()
                    .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme‌​)
                    .RequireAuthenticatedUser().Build());
            });

或者 2. 您可能錯過了為鍵“IssuerSigningKey”分配值,如下所示

validate.TokenValidationParameters = new TokenValidationParameters()
                                        {
                                            ValidateAudience = true,
                                            ValidAudience = "Audience",
                                            ValidateIssuer = true,
                                            ValidIssuer = "http://localhost:5000",
                                            RequireExpirationTime = false,
                                            ValidateIssuerSigningKey = true,
                                            IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("abcdefghi12345"))

                                        });

這解決了我的問題

我的核心 API 使用不同的服務配置(並且有效:)):

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
  .AddJwtBearer(options =>
  {
    Configuration.Bind("JwtBearer", options);
  }

您確定您傳遞的是訪問令牌而不是id_token嗎? 令牌中的aud聲明是否與您的API配置的客戶端 ID 完全相同? 您可能希望在選項中添加一些事件,以查看您收到的內容以及驗證失敗的位置。

  1. 驗證您為請求 jwt 令牌而發送的值(例如:grant_type、client_secret、scope、client_id 等)
  2. 確保您使用的是適當的令牌。 就這樣!

這是我的錯誤:我使用的是 Postman,並請求一個令牌並將其設置為變量“Var_Token1”:

pm.environment.set("Var_Token1", pm.response.json().access_token);

但是當我需要將令牌用於最終請求時,我選擇並使用了錯誤的令牌 (Var_Token2):

Authorization: Bearer {{Var_Token2}}

對我來說,出現此錯誤是因為 appsettings.json 中的 URL 不正確。 我修復了它,它現在工作正常。

如果您使用的 SignedOutCallbackPath/SignUpSignInPolicyId 策略 ID 與在令牌中作為 tfp/acr 傳遞的不同,也會發生這種情況。

我的問題是除了權限之外,我還需要在AddJwtBearer TokenValidationParameters中設置ValidIssuer選項

例如:

services.AddAuthentication("Bearer")
        .AddJwtBearer(options =>
        {
            options.Audience = "My Audience";
            options.Authority = "My issuer";
            options.TokenValidationParameters = new TokenValidationParameters {
                ValidateIssuerSigningKey = true,
                ValidateLifetime = true,
                ValidateIssuer = true,
                ValidIssuer = "Also My Issuer",    //Missing line here
                ValidateAudience = true
            };
        });

我遇到了這個問題,它是由 jwtOptions.Authority 未在配置中設置引起的。

如果您正在使用:

services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
            .AddIdentityServerAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme,

並且 jwtOptions.Authority 設置為 null 或 "" 你可以得到這個錯誤信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM