如何在客户端应用注册中为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
相关产品推荐
相关产品推荐

