我有以下代码,当我调用 api 端点时,出现错误
Bearer was not authenticated. Failure message: IDX10500: Signature validation failed. No security keys were provided to validate the signature.
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(cfg =>
{
cfg.RequireHttpsMetadata = false;
cfg.TokenValidationParameters = new TokenValidationParameters
{
ValidateAudience = false,
ValidateIssuer = false,
ValidateIssuerSigningKey = false
};
});
如果我设置
ValidateIssuerSigningKey=false
,为什么会发生这种情况?
请参阅帖子:https://github.com/aspnet/Security/issues/1741
您可以将委托 TokenValidationParameters.SignatureValidator 设置为仅返回 JwtSecurityToken。
目前您不能仅将
ValidateIssuerSigningKey
设置为 false 来跳过签名验证。作为解决方法,您可以将委托 TokenValidationParameters.SignatureValidator 设置为仅返回 JwtSecurityToken :
ValidateIssuerSigningKey = false,
SignatureValidator = delegate (string token, TokenValidationParameters parameters)
{
var jwt = new JwtSecurityToken(token);
return jwt;
},
仅当您确定 jwks 配置正确时才检查此项。
请注意,如果您同时引用了
Microsoft.IdentityModel.Tokens
和 System.IdentityModel.Tokens.Jwt
,也可能会发生这种情况
删除对 System.IdentityModel.Tokens.Jwt 的所有引用,清理您的解决方案(手动删除 bin/obj 文件夹)
重试。
从 .NET 6 升级到 .NET 8 后我们遇到了这个问题
我从 .NET 6 升级到 .NET 8 后遇到了这个问题。原来是由于
Microsoft.IdentityModel.Tokens
/ Microsoft.IdentityModel.JsonWebTokens
和 Microsoft.IdentityModel.Protocols.OpenIdConnect
之间的版本不兼容造成的。
我引用了
Microsoft.AspNetCore.Authentication.JwtBearer
版本8.0.4,它传递了Microsoft.IdentityModel.Protocols.OpenIdConnect
的7.1.2版本,同时我引用了Microsoft.IdentityModel.JsonWebTokens
的7.5.1版本。这些版本彼此不兼容 - 具体来说,这导致一个包中的某些 JSON 解析器代码与另一个包中的某些 JSON 解析器帮助程序之间不兼容,进而导致 jwks_uri
从 OIDC 配置文档中“丢失”被解析时。
要解决此问题,请确保所有
Microsoft.IdentityModel.
软件包使用相同版本。