如何在基于Microsoft Identity Platform的Blazor Server中获取AD组与OfficeLocation
解决方案
无需Graph API的方法:配置Azure AD应用,让Claims包含所需属性
默认Azure AD返回的Claims仅包含基础字段,要获取OfficeLocation和AD组信息,需在Azure AD应用注册中配置可选声明与组声明,让这些信息直接嵌入到用户登录后的令牌中,即可通过ClaimsPrincipal读取:
1. 获取OfficeLocation属性
- 登录Azure门户,找到你的应用注册,进入「令牌配置」页面
- 点击「添加可选声明」,选择ID令牌(Blazor Server场景一般用ID令牌)
- 在可选声明列表中找到
officeLocation并勾选,保存配置 - 登录后即可从Claims中读取该属性,扩展基类方法如下:
public async Task<string?> GetOfficeLocation() { var user = await GetUser(); return user?.FindFirst("officeLocation")?.Value; }
2. 获取AD组信息
Azure AD支持两种方式将组信息返回至Claims:
方式一:获取组ID
- 在「令牌配置」页面点击「添加组声明」
- 选择「安全组」或「所有组」,并指定返回格式为「组ID」
- 登录后可读取
groups类型的Claim获取组ID列表:
public async Task<List<string>?> GetGroupIds() { var user = await GetUser(); return user?.FindAll("groups")?.Select(c => c.Value).ToList(); }
方式二:获取组名称
- 先在应用注册的「API权限」中添加「Directory.Read.All」应用权限,需管理员同意
- 回到「组声明」配置,选择返回格式为「组名称」
- 登录后可读取
group_names类型的Claim获取组名称列表:
public async Task<List<string>?> GetGroupNames() { var user = await GetUser(); return user?.FindAll("group_names")?.Select(c => c.Value).ToList(); }
关于Graph API的使用场景
如果你的需求满足以下任一情况,使用Graph API是更合适的选择:
- 需要获取Azure AD用户的更多属性(不止
OfficeLocation) - 需要实时同步组信息(Claims仅在登录时生成,不会自动更新组变更)
- 希望避免令牌体积过大(携带过多Claims会增加令牌大小)
但仅需OfficeLocation和基础组信息时,通过Azure AD配置直接读取Claims是更轻量、高效的方案。
内容的提问来源于stack exchange,提问作者Rob C
相关产品推荐
相关产品推荐

