![](/img/trans.png)
[英]ASP.NET Core WebAPI: Bearer error="invalid_token", error_description="The signature key was not found"
[英]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...
}
無論ValidateIssuerSigningKey
是true
還是false
,我仍然收到“invalid_token”401 響應,與 OP 相同。 我什至嘗試指定一個自定義IssuerSigningKeyValidator
委托來始終覆蓋結果,但也沒有運氣。
WWW-Authenticate: Bearer error="invalid_token", error_description="找不到簽名密鑰"
當我將IssuerSigningKey
添加到TokenValidationParameters
object (當然匹配我在單元測試中生成令牌時使用的密鑰)時,一切都按預期工作。
可能有兩個原因:
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 完全相同? 您可能希望在選項中添加一些事件,以查看您收到的內容以及驗證失敗的位置。
這是我的錯誤:我使用的是 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.