如何在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
相关产品推荐
相关产品推荐

