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

如何在ASP.NET Core WebAPI中验证JWT的azp声明?

验证JWT的azp声明

你可以通过以下两种方式在现有代码中添加azp声明的验证逻辑:

方式一:通过TokenValidationParameters自定义验证

直接在JwtBearerOptions的TokenValidationParameters中添加azp的验证逻辑,适合简单的白名单校验:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(jwtBearerOptions =>
    {
        configuration.Bind("AzureAdB2C", jwtBearerOptions);
        
        // 配置允许的azp值列表
        var allowedAzpValues = new[] { "允许的客户端ID1", "允许的客户端ID2" };
        
        jwtBearerOptions.TokenValidationParameters.AudienceValidator = (audiences, securityToken, validationParameters) =>
        {
            if (securityToken is not JwtSecurityToken jwtToken) return false;
            
            // 提取azp声明值
            var azpValue = jwtToken.Claims.FirstOrDefault(c => c.Type == "azp")?.Value;
            
            // 验证azp是否在允许的列表中
            return !string.IsNullOrEmpty(azpValue) && allowedAzpValues.Contains(azpValue);
        };
    },
    microsoftIdentityOptions => { configuration.Bind("AzureAdB2C", microsoftIdentityOptions); });

方式二:通过OnTokenValidated事件验证

如果需要更灵活的验证逻辑(比如从数据库读取允许的azp列表),可以使用JWT验证事件:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(jwtBearerOptions =>
    {
        configuration.Bind("AzureAdB2C", jwtBearerOptions);
        
        jwtBearerOptions.Events = new JwtBearerEvents
        {
            OnTokenValidated = context =>
            {
                // 从当前用户主体中获取azp声明
                var azpClaim = context.Principal?.FindFirst("azp");
                
                // 验证azp是否有效
                if (azpClaim == null || !IsAzpAllowed(azpClaim.Value))
                {
                    context.Fail("无效的azp声明");
                }
                
                return Task.CompletedTask;
            }
        };
    },
    microsoftIdentityOptions => { configuration.Bind("AzureAdB2C", microsoftIdentityOptions); });

// 自定义azp校验方法
private bool IsAzpAllowed(string azpValue)
{
    // 替换为实际的允许列表,可从配置或数据库读取
    var allowedAzps = new[] { "允许的客户端ID1", "允许的客户端ID2" };
    return allowedAzps.Contains(azpValue);
}

注意事项

  • 把代码中的允许的客户端ID1、允许的客户端ID2替换成你实际要放行的客户端ID(也就是JWT令牌中azp字段的有效值);
  • 两种方式都能实现azp声明的验证,选择哪种取决于你的验证复杂度需求。

内容的提问来源于stack exchange,提问作者Allan Xu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:02:56