问题描述
在 .Net Core WEB API 中实现了 JWT Bearer Token 验证,如下所述:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(opt =>
{
opt.Audience = Configuration["AAD:ResourceId"];
opt.Authority = $"{Configuration["AAD:Instance"]}{Configuration["AAD:TenantId"]}";
});
怀疑上面提到的代码只会验证观众和权限吗?或者它会验证所有参数,如过期和签名等?
我们是否需要显式验证签名以检查有效负载是否已被篡改?
解决方法
我认为您正在寻找这个:
https://zhiliaxu.github.io/how-do-aspnet-core-services-validate-jwt-signature-signed-by-aad.html
在这里zhiliaxu详细解释了使用.AddJwtBearer()
时实际验证的方式和内容,他的结论是:
现在很明显
- 无需提供任何密钥或证书即可验证 JWT 签名 在我们服务的源代码中。
- JWT 签名密钥是从众所周知的 URL https://login.microsoftonline.com/common/discovery/keys 中检索的,基于 JwtBearerOptions.Authority 属性。
- 签名密钥缓存在 JwtBearerHandler 单例实例中,因此我们的 ASP.NET Core 服务只需要检索它 在整个生命周期中一次。
同样基于这篇文章,我们可以查看 MSDN 上的 ValidateToken()
文档:https://docs.microsoft.com/en-us/dotnet/api/system.identitymodel.tokens.jwt.jwtsecuritytokenhandler.validatetoken?view=azure-dotnet 您可以在其中找到该方法抛出的不同异常:
- SecurityTokenDecryptionFailedException:令牌是无法解密的 JWE。
- SecurityTokenEncryptionKeyNotFoundException:令牌“kid”标头声明不为空且解密失败。
- SecurityTokenException:令牌“enc”标头声明为 null 或为空。
-
SecurityTokenExpiredException:令牌“exp”声明为
- SecurityTokenInvalidAudienceException:令牌“aud”声明与 ValidAudience 或 ValidAudience 之一不匹配。
- SecurityTokenInvalidLifetimeException:令牌“nbf”声明是 >“exp”声明。
- SecurityTokenInvalidSignatureException:token.signature 的格式不正确。
- SecurityTokenNoExpirationException:TokenReplayCache 不为 null,且 expireTime.HasValue 为 false。设置 TokenReplayCache 后,令牌需要一个过期时间。
- SecurityTokenNotYetValidException:令牌“nbf”声明是 > DateTime.UtcNow。
- SecurityTokenReplayAddFailedException:无法将令牌添加到 TokenReplayCache。
- SecurityTokenReplayDetectedException:在缓存中找到令牌。