C# .Net核心API JWT令牌验证
在.Net核心WEB API中实现了JWT承载令牌验证,如下所述:C# .Net核心API JWT令牌验证,c#,.net-core,jwt,bearer-token,C#,.net Core,Jwt,Bearer Token,在.Net核心WEB API中实现了JWT承载令牌验证,如下所述: services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(opt => { opt.Audience = Configuration["AAD:ResourceId"];
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(opt =>
{
opt.Audience = Configuration["AAD:ResourceId"];
opt.Authority = $"{Configuration["AAD:Instance"]}{Configuration["AAD:TenantId"]}";
});
这里的疑问是,上面提到的代码将只验证受众和权威?或者它将验证所有参数,如过期和签名等
我们是否需要显式验证签名以检查有效负载是否被篡改?我想您正在寻找以下信息: 在这里,zhiliaxu详细解释了使用
.AddJwtBearer()
时实际验证的方式和内容,他的结论如下:
现在很清楚
- JWT签名在未提供任何密钥或证书的情况下进行验证 在我们服务的源代码中
- JWT签名密钥是根据 JwtBearerOptions.Authority属性
- 签名密钥缓存在JwtBearerHandler singleton实例中,因此我们的ASP.NET核心服务只需要检索它 在它的整个生命周期中只有一次
ValidateToken()
文档:在这里可以找到该方法引发的不同异常:
- SecurityTokenDecryptionFailedException:令牌是一个JWE,无法解密
- SecurityTokenEncryptionKeyNotFoundException:令牌“kid”头声明不为null,解密失败
- SecurityTokenException:令牌“enc”头声明为null或空
- SecurityTokenExpiredException:令牌“exp”声明为
- SecurityTokenInvalidAudienceException:标记“aud”声明与有效性或其中一个有效性不匹配
- SecurityTokenInvalidLifeetimeException:令牌“nbf”声明为>“exp”声明
- SecurityTokenInvalidSignatureException:token.signature的格式不正确
- SecurityTokenNoExpirationException:TokenReplayCache不为null,expirationTime.HasValue为false。设置TokenReplayCache时,令牌需要过期时间
- SecurityTokenNotYetValidException:令牌“nbf”声明为>DateTime.UtcNow
- SecurityTokenReplayAddFailedException:无法将令牌添加到令牌ReplayCache
- SecurityTokenReplayDetectedException:在缓存中找到令牌
JWT承载身份验证通过从授权请求头提取和验证JWT令牌来执行身份验证。
调用API时出现以下错误:IDX10501:签名验证失败。无法匹配密钥:kid:'icmvbl6kv2zkbug2ip9miotew9a'。因此遵循IDX10501中提到的答案:签名验证失败。无法匹配密钥,但仍得到相同的异常。如果需要在Azure end中配置某些内容,请告知我。API上的权限似乎未正确设置。尝试导航到您的权限发现文档:https://yourauthority.com/.well-known/openid-configuration
您应该看到一个JSON文档作为响应。在JSON文档中,您应该看到一个jwks\u uri
属性,类似于https://yourauthority.com/.well-known/openid-configuration/jwks
。导航到该URL,您将获得一个带有授权公钥的json,查看kid
属性,它应该与您令牌上的内容匹配。将您的令牌输入jwt.io
网站,检查其内容并比较孩子(密钥ID)。波尔