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

无需调用MS Graph API,如何通过Bearer令牌获取AD用户信息?

解决方案汇总

方案1:解析JWT令牌内置Claims(最优选择,无额外调用、无需额外权限)

你通过msal.js获取的ID令牌本身已经嵌入了/me接口返回的全部核心用户属性,这些属性以声明(Claim)的形式存在于JWT结构中,完全不需要调用MS Graph或其他外部接口,也不需要管理员授予任何额外权限。

字段对应关系:

Graph /me 字段对应JWT Claim名
idsub
displayNamename
userPrincipalNamepreferred_username
mailemail
tenantIdtid
givenNamegiven_name
surnamefamily_name

.NET Core 代码示例:

手动解析令牌场景:

using System.IdentityModel.Tokens.Jwt;
using System.Linq;

var jwtHandler = new JwtSecurityTokenHandler();
var decodedToken = jwtHandler.ReadJwtToken("前端传入的Bearer令牌字符串");

// 读取用户属性
var userId = decodedToken.Claims.FirstOrDefault(c => c.Type == JwtRegisteredClaimNames.Sub)?.Value;
var displayName = decodedToken.Claims.FirstOrDefault(c => c.Type == JwtRegisteredClaimNames.Name)?.Value;
var userPrincipalName = decodedToken.Claims.FirstOrDefault(c => c.Type == "preferred_username")?.Value;
var email = decodedToken.Claims.FirstOrDefault(c => c.Type == JwtRegisteredClaimNames.Email)?.Value;

已配置Azure AD认证中间件场景:

如果你的.NET Core服务已经添加了Microsoft.Identity.Web相关的Azure AD认证配置,不需要手动解析令牌,直接从HttpContext.User中读取即可:

using Microsoft.Identity.Web;

// 直接读取Claims
var userId = User.GetObjectId();
var displayName = User.FindFirstValue(JwtRegisteredClaimNames.Name);
var userPrincipalName = User.GetDisplayName();

方案2:调用OIDC标准UserInfo端点

如果ID令牌中没有包含你需要的自定义用户属性,可以调用Azure AD的OIDC UserInfo端点,该端点属于OpenID Connect标准认证能力,不需要管理员授予MS Graph API权限,仅需要你在msal.js申请令牌时请求了openid profile email这几个基础scope即可。

.NET Core 调用代码示例:

using System.Net.Http;
using System.Net.Http.Headers;
using System.Text.Json;

var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "前端传入的Bearer令牌字符串");

// 公有云Azure AD端点,如果你使用的是国内版Azure、ADFS或B2C,请替换为对应租户的OIDC UserInfo端点
var userInfoResponse = await httpClient.GetAsync("https://login.microsoftonline.com/common/openid/v2.0/userinfo");
userInfoResponse.EnsureSuccessStatusCode();

var userInfoContent = await userInfoResponse.Content.ReadAsStringAsync();
var userAttributes = JsonSerializer.Deserialize<Dictionary<string, object>>(userInfoContent);

// 读取对应属性
var userId = userAttributes["sub"].ToString();
var displayName = userAttributes["name"].ToString();

补充说明:两种方案返回的用户属性和https://graph.microsoft.com/v1.0/me返回的核心用户信息完全一致,仅缺少Graph特有的扩展属性,如果需要扩展属性需要联系管理员开放对应Graph权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 09:24:04