You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 6 API如何重写SignatureValidator并按需回退默认验证行为

解决方案

你的核心问题在于自定义SignatureValidator时,没有正确复用框架默认的签名验证逻辑,而是直接调用ValidateToken触发了完整验证,导致和原有流程冲突。下面是可行的实现方案,无需新增认证方案,也不用修改路由:

实现步骤

  1. 配置测试开关与颁发者:在测试环境的appsettings.Test.json中添加专属配置,确保生产环境不会启用该功能:
"TestAutoFakeToken": {
  "Enabled": true,
  "Issuer": "your-internal-test-issuer"
}
  1. 复用默认签名验证器:在AddJwtBearer配置中,先保存框架默认的SignatureValidator委托,再根据测试开关替换为自定义逻辑:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        // 读取测试配置
        var testAutoSection = builder.Configuration.GetSection("TestAutoFakeToken");
        var isTestModeEnabled = testAutoSection.GetValue<bool>("Enabled");
        var testIssuer = testAutoSection.GetValue<string>("Issuer");

        // 配置正常的Azure B2C JWT验证参数
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidIssuers = new[] { "your-azure-b2c-issuer" },
            ValidateAudience = true,
            ValidAudience = "your-api-audience",
            ValidateLifetime = true,
            IssuerSigningKeys = // 配置Azure B2C的签名密钥(可从元数据端点获取)
        };

        // 保存框架默认的签名验证器,避免自定义逻辑覆盖原有逻辑
        var defaultSignatureValidator = options.TokenValidationParameters.SignatureValidator;

        // 仅在测试环境启用自定义逻辑
        if (isTestModeEnabled)
        {
            options.TokenValidationParameters.SignatureValidator = (token, validationParams) =>
            {
                var handler = new JwtSecurityTokenHandler();
                // 无需验证签名即可读取JWT的颁发者(JWT的Payload是Base64编码可直接解析)
                var jwtToken = handler.ReadJwtToken(token);

                // 判断是否为测试颁发者,是则跳过签名验证
                if (string.Equals(jwtToken.Issuer, testIssuer, StringComparison.OrdinalIgnoreCase))
                {
                    return jwtToken;
                }

                // 非测试令牌,调用默认签名验证逻辑
                return defaultSignatureValidator(token, validationParams);
            };
        }
    });

关键说明

  • 避免重复验证:直接复用默认的SignatureValidator,而非手动调用ValidateToken,确保非测试令牌的验证逻辑和原有流程完全一致,不会额外触发issuer、audience等重复验证。
  • 安全边界:通过测试开关严格控制功能范围,生产环境必须关闭该开关;测试颁发者要严格限定为内部已知值,防止恶意令牌绕过验证。
  • 无侵入性:所有路由仍使用原有认证方案,无需修改任何路由配置。

内容的提问来源于stack exchange,提问作者Antoine Brisebois-Roy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 16:43:21