无需调用MS Graph API,如何通过Bearer令牌获取AD用户信息?
解决方案汇总
方案1:解析JWT令牌内置Claims(最优选择,无额外调用、无需额外权限)
你通过msal.js获取的ID令牌本身已经嵌入了/me接口返回的全部核心用户属性,这些属性以声明(Claim)的形式存在于JWT结构中,完全不需要调用MS Graph或其他外部接口,也不需要管理员授予任何额外权限。
字段对应关系:
| Graph /me 字段 | 对应JWT Claim名 |
|---|---|
| id | sub |
| displayName | name |
| userPrincipalName | preferred_username |
| tenantId | tid |
| givenName | given_name |
| surname | family_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
相关产品推荐
相关产品推荐

