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

如何用MSAL为.NET Core应用生成含已登录用户及角色的AccessToken

问题原因及解决方案

核心问题

你当前使用的AcquireTokenForClient方法属于客户端凭证授权流,这个流是服务与服务之间的认证模式,令牌仅代表你的应用本身,不会包含任何用户相关的声明、角色信息——因为该流程不需要用户参与,完全是应用以自身身份请求API权限。

正确实现方式

既然用户已经完成登录,要获取包含用户角色的访问令牌,你需要使用On-Behalf-Of(OBO)授权流,该流程允许后端服务用已登录用户的身份,代表用户向Azure API请求令牌。

步骤1:调整MSAL客户端初始化(保留原有基础配置)

var app = ConfidentialClientBuilder.Create(ClientID)
    .WithClientSecret("xxxxxx")
    .WithAuthority("https://login.microsoftonline.com/你的租户ID")
    .Build();

步骤2:使用OBO流获取含用户信息的令牌

需要传入用户登录后得到的用户访问令牌作为断言(Assertion),同时指定目标API的scope:

// userToken是用户登录时获取到的访问令牌(可从认证上下文或前端传入)
var userAssertion = new UserAssertion(userToken);

// 指定目标Azure API的scope,示例:"https://management.azure.com/.default"
var scopes = new[] { "目标API的scope" };

var result = await app.AcquireTokenOnBehalfOf(scopes, userAssertion)
    .ExecuteAsync();

var userAwareToken = result.AccessToken;

额外配置要求

  1. 在Azure AD中,确保你的.NET Core应用已被授予目标Azure API的委托权限,并完成管理员同意。
  2. 若要让令牌包含用户角色,需:
    • 在Azure AD应用注册中定义用户角色(或使用内置角色);
    • 在Azure AD的「企业应用」-> 你的应用 ->「用户和组」中,将用户分配到对应角色。

补充说明

如果是前端+后端架构,也可以让前端通过MSAL.js直接获取用户级访问令牌,再传递给后端调用Azure API——这种方式下令牌天然包含用户角色信息,但需确保前端已正确配置对应API权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 22:37:47