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

在C#中使用MSAL获取Azure AD企业应用用户组JWT令牌的问题

解决MSAL桌面客户端获取含Azure AD企业应用组信息令牌的问题

核心问题分析

你用oidc-client能拿到带组信息的令牌,是因为请求的自定义scopeapi://${APP_CLIENT_ID}/user_access已完成正确配置,且Azure AD会在满足条件时返回组声明。而MSAL中直接复用该scope报错,通常是应用权限配置或客户端类型限制导致;使用/.default能拿到令牌但无组信息,是因为该静态scope未触发组声明的返回逻辑,或目标应用未配置组声明。

正确的Scope配置与使用步骤

1. 确认自定义Scope的有效性

  • 登录Azure门户,进入目标企业应用对应的应用注册,切换到「公开API」页:
    • 检查是否已创建user_access这个自定义Scope,且设置了允许的同意类型(桌面客户端建议开启管理员同意)。
  • 进入桌面客户端的应用注册,切换到「API权限」页:
    • 添加目标企业应用的权限,找到user_access并添加,点击「授予管理员同意」完成权限配置。

2. MSAL中正确的Scope写法

在MSAL的令牌请求中,直接使用完整的自定义Scope,搭配身份基础Scope,示例如下(以MSAL.NET为例):

var scopes = new[] { "openid", "email", "profile", "api://{你的APP_CLIENT_ID}/user_access" };
var result = await _publicClientApplication.AcquireTokenInteractive(scopes)
    .ExecuteAsync();

注意:如果桌面客户端是公共客户端(如WPF、Electron),需确保目标应用注册的「认证」页中,「允许公共客户端流」已设置为「是」。

3. 配置Azure AD返回组信息

即使Scope正确,还要确保Azure AD会在令牌中注入组声明:

  • 进入目标企业应用的应用注册,切换到「令牌配置」页:
    • 点击「添加可选声明」,选择「ID令牌」或「访问令牌」,添加groups声明,按需选择返回组ID或显示名称。
  • 若使用v2.0端点,还需修改应用注册的清单:
    • 将groupMembershipClaims字段设置为SecurityGroup(仅返回安全组)或All(返回所有组),示例:
      "groupMembershipClaims": "SecurityGroup"
      
  • 另外,进入企业应用的「用户属性」页,将「组声明」设置为需要返回的组类型(如安全组)。

替代方案(当自定义Scope仍有问题时)

如果自定义Scope的配置始终报错,可以尝试以下方式:

  1. 使用api://{APP_CLIENT_ID}/.default作为Scope,但需确保:
    • 桌面客户端的应用注册已添加目标应用的所有必要权限并完成管理员同意。
    • 目标应用已按上述步骤配置了组声明,确保令牌中包含组信息。
  2. 强制触发交互式授权:
    使用MSAL的AcquireTokenInteractive方法(而非静默方式),确保授权流程能正确加载权限配置,完成用户/管理员同意。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 19:37:46