如何为Azure AD添加可选声明?C# MVC Web API守护模式认证
给Azure AD守护程序应用添加自定义声明的解决方案
我之前也碰到过类似的问题,给你梳理几个可行的方案,以及清单编辑的正确示例,帮你解决这个问题:
一、通过应用清单添加可选声明的正确示例
守护程序应用使用客户端凭据流获取访问令牌,所以需要在应用清单的optionalClaims部分配置accessToken类型的自定义声明。这里给你一个符合Azure AD规则的配置示例:
"optionalClaims": { "accessToken": [ { "name": "extension_<你的租户ID>_Environment", "source": null, "essential": false, "additionalProperties": [] }, { "name": "extension_<你的租户ID>_ApplicationRole", "source": null, "essential": true, "additionalProperties": [] } ] }
关键注意事项(避免保存出错):
- 自定义声明必须以
extension_<你的租户ID>_为前缀,租户ID可以在Azure AD的「概述」页面找到(是一个GUID) - 声明名称不能包含特殊字符,尽量用字母、数字和下划线
- 确保JSON格式完全正确,比如逗号、括号配对,建议用在线JSON校验工具先检查格式
essential设为true时,意味着Web API必须收到这个声明才会接受令牌
二、更灵活的方案:使用Azure AD Claims Transformation
如果直接编辑清单满足不了你的需求(比如需要动态生成声明、从应用属性提取值),可以试试Claims Transformation功能:
- 步骤:
- 登录Azure门户,进入「Azure Active Directory」→「企业应用程序」,找到你的守护程序应用
- 在左侧菜单里找到「Claims Transformation」(如果没看到,需要先在「预览功能」里开启该功能)
- 创建新的转换规则,比如添加静态声明、从应用的扩展属性中提取值,或者对现有声明进行修改
- 将创建好的转换规则关联到应用的令牌颁发策略
这种方式适合复杂的声明逻辑,比直接编辑清单更灵活。
三、Web API端验证自定义声明的代码示例
在C# MVC Web API中,你可以这样获取并验证自定义声明:
直接在控制器中检查声明
[Authorize] [HttpGet("api/secure-data")] public IActionResult GetSecureData() { // 替换成你的自定义声明完整名称 var customClaim = User.Claims.FirstOrDefault(c => c.Type == "extension_<你的租户ID>_Environment"); if (customClaim == null || customClaim.Value != "Production") { return Forbid("Invalid environment claim"); } return Ok("Authenticated and validated with custom claim"); }
使用策略授权(更优雅的方式)
在Program.cs(或Startup.cs)中配置授权策略:
builder.Services.AddAuthorization(options => { options.AddPolicy("ProductionEnvironment", policy => policy.RequireClaim("extension_<你的租户ID>_Environment", "Production")); });
然后在控制器或动作上使用该策略:
[Authorize(Policy = "ProductionEnvironment")] [HttpGet("api/production-data")] public IActionResult GetProductionData() { return Ok("Access granted to production data"); }
四、常见问题排查
- 清单保存失败:检查JSON格式是否正确,租户ID是否填写正确,声明名称是否符合
extension_<租户ID>_<名称>的规则 - 令牌中没有自定义声明:重新获取令牌(客户端凭据流需要调用令牌端点重新请求),等待5-10分钟让Azure AD同步配置,用
https://jwt.ms解码令牌查看声明是否存在
内容的提问来源于stack exchange,提问作者jmascaro
相关产品推荐
相关产品推荐

