已配置对应声明,如何从Azure AD JWT Claims中获取用户的名与姓?
解决Azure AD JWT令牌无法获取given_name和family_name的问题
先确认令牌是否包含目标声明
先排查解码后的JWT里实际有没有这两个字段,避免是配置未生效:
// 遍历输出所有声明,检查given_name和family_name是否存在 foreach (var claim in decodedeIdtoken.Claims) { Console.WriteLine($"{claim.Type}: {claim.Value}"); }
如果输出里没有这两个字段,先核对Azure配置:
- 确认在应用注册 > 令牌配置中,已添加
given_name和family_name可选声明,且勾选了ID令牌选项 - 检查应用权限,确保已添加
User.Read委托权限并完成管理员同意(企业应用场景)
精准读取声明的两种方法
如果确认令牌包含目标字段,用以下方式获取:
方式1:直接匹配声明类型字符串
var givenName = decodedeIdtoken.Claims.FirstOrDefault(c => c.Type == "given_name")?.Value; var familyName = decodedeIdtoken.Claims.FirstOrDefault(c => c.Type == "family_name")?.Value;
方式2:使用ClaimTypes规范映射
借助System.Security.Claims中的枚举,避免硬编码字符串:
using System.Security.Claims; var givenName = decodedeIdtoken.Claims.FirstOrDefault(c => c.Type == ClaimTypes.GivenName)?.Value; var familyName = decodedeIdtoken.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Surname)?.Value;
排查令牌获取流程问题
若配置无误仍无字段,检查令牌请求环节:
- 确保请求令牌时的
scope参数包含profile(该范围用于返回用户姓名等基础信息),示例scope:openid profile User.Read - 若使用MSAL库获取令牌,确认客户端初始化时已正确配置所需范围
内容的提问来源于stack exchange,提问作者sajid
相关产品推荐
相关产品推荐

