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

如何为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功能:

  • 步骤:
    1. 登录Azure门户,进入「Azure Active Directory」→「企业应用程序」,找到你的守护程序应用
    2. 在左侧菜单里找到「Claims Transformation」(如果没看到,需要先在「预览功能」里开启该功能)
    3. 创建新的转换规则,比如添加静态声明、从应用的扩展属性中提取值,或者对现有声明进行修改
    4. 将创建好的转换规则关联到应用的令牌颁发策略

这种方式适合复杂的声明逻辑,比直接编辑清单更灵活。

三、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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:48:58