【发布时间】:2021-01-24 14:35:36
【问题描述】:
我必须验证 jwt 访问令牌。 (在旧版 WCF REST 服务 .NET 4.7.2 中) 为此,我使用 nuget 包 Microsoft.IdentityModel.JsonWebTokens 6.7.1。来自 okta 的示例演示了如何执行此操作 (example)。 (非常感谢)
使用库验证他们编写的令牌后:
您还必须验证 alg 声明是否与用于签署令牌的预期算法相匹配。您必须在 ValidateToken 方法返回经过验证的令牌后执行此检查:
// Validate alg
var validatedToken = await ValidateToken(idToken, issuer, configurationManager);
var expectedAlg = SecurityAlgorithms.RsaSha256; //Okta uses RS256
if (validatedToken.Header?.Alg == null || validatedToken.Header?.Alg != expectedAlg)
{
throw new SecurityTokenValidationException("The alg must be RS256.");
}
还有一个来自 Auth0 的 blog post,关于“信任”jwt 标头的“alg”值的库中的漏洞。
当我检查 IdentityModel.JsonWebTokens 包的 validation implementation 时,我认为以下代码中的 IsSupportedAlgorithm 调用可以保护库不使用错误的键/算法组合。
internal static bool ValidateSignature(byte[] encodedBytes, byte[] signature, SecurityKey key, string algorithm, SecurityToken securityToken, TokenValidationParameters validationParameters)
{
var cryptoProviderFactory = validationParameters.CryptoProviderFactory ?? key.CryptoProviderFactory;
if (!cryptoProviderFactory.IsSupportedAlgorithm(algorithm, key))
{
LogHelper.LogInformation(LogMessages.IDX14000, algorithm, key);
return false;
}
因此,我认为 okta JWT 验证指南在这方面是错误的或过时的。你同意我的观点吗?
【问题讨论】: