C# .Net核心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"];

在.Net核心WEB API中实现了JWT承载令牌验证,如下所述:

 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核心服务只需要检索它 在它的整个生命周期中只有一次
基于本文,我们还可以查看MSDN上的
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)。波尔