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

如何在客户端应用注册中为Access Token添加自定义声明并传递至API

实现多客户端自定义声明及API读取方案

一、为每个客户端配置自定义声明MyClaim

根据你使用的身份认证服务(如IdentityServer、Azure AD等),给每个客户端单独配置专属的MyClaim值:

1. IdentityServer4 场景

在客户端配置实例中,通过Claims属性为每个客户端设置唯一值:

// 客户端1配置
new Client
{
    ClientId = "ClientApp1",
    // 其他基础配置(密钥、授权类型等)...
    Claims = new List<ClientClaim>
    {
        new ClientClaim("MyClaim", "ClientApp1_SpecificValue")
    }
}

// 客户端2配置
new Client
{
    ClientId = "ClientApp2",
    // 其他基础配置...
    Claims = new List<ClientClaim>
    {
        new ClientClaim("MyClaim", "ClientApp2_SpecificValue")
    }
}

同时要确保对应的ApiResource或ApiScope已声明包含MyClaim,保证令牌能输出该声明。

2. Azure AD 场景

在Azure门户进入每个客户端应用的令牌配置页面:

  • 点击「添加可选声明」,选择访问令牌/ID令牌(根据你的业务场景选择)
  • 点击「添加自定义声明」,输入声明名称MyClaim,选择类型为字符串,为每个客户端设置不同的专属值
  • 保存后,确认API应用已授予该客户端的访问权限并完成授权。

二、确保客户端获取的Access Token包含MyClaim

客户端请求令牌时,需指定包含MyClaim的权限范围,以ASP.NET Core客户端为例:

services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
    options.Authority = "https://your-auth-server.com";
    options.ClientId = "ClientApp1";
    options.ClientSecret = "your-client-secret";
    options.ResponseType = "code";
    // 请求包含MyClaim的API范围
    options.Scope.Add("your-api-scope");
    // 映射自定义声明到用户身份
    options.ClaimActions.MapUniqueJsonKey("MyClaim", "MyClaim");
});

三、在Web API中读取MyClaim的值

1. 控制器直接读取

[ApiController]
[Route("api/[controller]")]
public class DemoController : ControllerBase
{
    [HttpGet("check-claim")]
    public IActionResult GetMyClaim()
    {
        var myClaimValue = User.Claims.FirstOrDefault(c => c.Type == "MyClaim")?.Value;
        
        if (string.IsNullOrEmpty(myClaimValue))
        {
            return BadRequest("MyClaim未在令牌中找到");
        }
        
        return Ok(new { 当前客户端专属值 = myClaimValue });
    }
}

2. 服务类中通过依赖注入读取

先在Program.cs/Startup.cs注册IHttpContextAccessor:

services.AddHttpContextAccessor();

然后在服务类中注入使用:

public class BusinessService
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public BusinessService(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public string GetClientClaimValue()
    {
        return _httpContextAccessor.HttpContext?.User.Claims
            .FirstOrDefault(c => c.Type == "MyClaim")?.Value;
    }
}

关键注意事项

  • 可用JWT解析工具(如本地离线解析工具)验证令牌Payload是否包含MyClaim,确保配置生效
  • Azure AD场景下,需在API应用的「令牌配置」中添加接受自定义声明的配置,避免API无法识别
  • 每个客户端的MyClaim值需在身份认证服务端单独配置,避免值重叠混淆

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 21:18:23