【问题标题】:Is manual check of "alg" required when validation JWT?验证 JWT 时是否需要手动检查“alg”?
【发布时间】: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 验证指南在这方面是错误的或过时的。你同意我的观点吗?


【问题讨论】:

    标签: .net jwt


    【解决方案1】:

    Okta 的 jwt 验证指南特别提到: "在 ValidateToken 方法返回经过验证的令牌后,您必须执行此检查(alg 检查)"

    我相信只有当验证库依赖此 alg 声明来选择验证算法时,这才是问题。

    【讨论】:

    • 我也这么认为。这就是问题所在。他们写道,您应该检查,但使用我似乎不需要检查的库。问题是当 oidc 发现文档在 jwks 参数中发布密钥/alg 对时,我不想将 alg 限制为 Rs256。
    猜你喜欢
    • 1970-01-01
    • 2021-06-24
    • 2016-12-16
    • 2019-05-08
    • 2020-11-27
    • 2015-12-25
    • 2019-10-10
    • 1970-01-01
    • 2019-04-23
    相关资源
    最近更新 更多