CA5405:不要始终跳过委托中的令牌验证

属性
规则 ID CA5405
标题 请勿始终跳过委托中的令牌验证
类别 安全性
修复是中断修复还是非中断修复 非中断
在 .NET 8 中默认启用

原因

分配给 AudienceValidatorLifetimeValidator 的回调始终返回 true

规则说明

通过设置关键的 TokenValidationParameter 验证委托以始终返回 true,会禁用重要的身份验证保护机制。 禁用保护机制可能导致错误地验证来自任何颁发者的令牌或已过期的令牌。

有关令牌验证最佳做法的详细信息,请参阅库的 Wiki

如何解决冲突

  • 改进委托逻辑,以避免所有代码路径都返回 true(实际上会禁用该验证类型)。
  • 当你想要使验证失败,让其他案例通过验证(返回 true)时,在失败案例中会引发 SecurityTokenInvalidAudienceExceptionSecurityTokenInvalidLifetimeException

何时禁止显示警告

在某些特定的情况下,如果你利用委托进行额外的日志记录,而该委托用于不需要特定验证类型的令牌类型,则禁止显示此警告可能会有作用。 在禁用此验证之前,请务必充分考虑安全后果。 有关利弊的信息,请参阅令牌验证库的 Wiki

抑制警告

如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。

#pragma warning disable CA5405
// The code that's violating the rule is on this line.
#pragma warning restore CA5405

若要对文件、文件夹或项目禁用该规则,请在配置文件中将其严重性设置为 none

[*.{cs,vb}]
dotnet_diagnostic.CA5405.severity = none

有关详细信息,请参阅如何禁止显示代码分析警告

伪代码示例

冲突

using System;
using Microsoft.IdentityModel.Tokens;

class TestClass
{
    public void TestMethod()
    {
        TokenValidationParameters parameters = new TokenValidationParameters();
        parameters.AudienceValidator = (audiences, token, tvp) => { return true; };
    }
}

解决方案

using System;
using Microsoft.IdentityModel.Tokens;

class TestClass
{
    public void TestMethod()
    {
        TokenValidationParameters parameters = new TokenValidationParameters();
        parameters.AudienceValidator = (audiences, token, tvp) =>
        {
            // Implement your own custom audience validation
            if (PerformCustomAudienceValidation(audiences, token))
                return true;
            else
                return false;
        };
    }
}