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

AAD是否支持nonce声明?客户端凭据流参数传递失效

问题分析与解决方案

首先明确:Azure AD的客户端凭据流(Client Credentials Flow)不支持nonce参数。这个参数是为包含用户交互的授权流(如授权码流、隐式流)设计的,用于防范重放攻击;而客户端凭据流是服务间直接的身份认证,不存在用户上下文,AAD不会处理URL中的nonce参数,也不会将其加入返回的token声明中——这和ADB2C的场景本质不同,ADB2C聚焦用户身份验证,所以支持nonce。

如果你需要在这个流程中传递自定义值并在token或认证环节体现,可采用以下替代方案:

方案1:使用客户端断言(Client Assertion)

放弃使用client_secret,改用JWT格式的客户端断言发起token请求,将自定义值嵌入断言的payload中。

  • 示例请求:
    POST https://login.microsoftonline.com/{tenant-id}/oauth2/token
    Content-Type: application/x-www-form-urlencoded
    
    grant_type=client_credentials
    &client_id={你的客户端ID}
    &client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer
    &client_assertion={包含自定义字段的JWT断言}
    &resource={目标资源ID}
    
  • 你可以在JWT断言的payload里添加自定义字段(比如"custom_nonce": "testValue"),生成断言时包含该内容。后续无论是验证断言还是内部业务逻辑,都可以读取这个自定义值。

方案2:配置应用程序扩展属性

如果需要让自定义值直接出现在返回的access token声明中,可以通过Azure AD的应用程序扩展属性实现:

  1. 使用Microsoft Graph API创建应用程序扩展属性,指定关联到你的服务主体;
  2. 为服务主体设置该扩展属性的对应值;
  3. 在应用程序的可选声明(Optional Claims)配置中,将该扩展属性添加到access token的声明列表里。
    之后发起客户端凭据流请求时,返回的token就会包含这个自定义声明。

方案3:本地/缓存关联存储

如果你的场景是自有服务间调用,可以在发起token请求前,将自定义值(如testValue)与客户端ID、token有效期等信息关联,存储到本地缓存或分布式缓存中。在后续验证token并处理业务逻辑时,根据客户端ID和token的标识取出对应的自定义值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 16:10:13