.NET Core应用Azure AD组授权及Microsoft Graph权限疑问
嗨,看你已经在基于Azure AD组的授权上折腾了不少步骤,还成功用客户端凭据调用了Graph,挺棒的!我来帮你理清这两个疑问:
疑问1:能否复用当前已有的令牌调用Microsoft Graph API?
不能直接复用,核心原因是令牌的「受众(aud)」不匹配:
- 你当前Web API收到的用户令牌,
aud字段是你的后端API的ClientId或AppIdUri,这是Azure AD颁发给你的API专用的令牌; - 而Microsoft Graph API要求令牌的
aud必须是https://graph.microsoft.com,所以这个令牌没法直接用来调用Graph。
那正确的解决方案是使用On-Behalf-Of(OBO,代表用户)流程:你的Web API可以拿着当前用户的令牌,向Azure AD请求一个专门针对Microsoft Graph的委派令牌,再用这个新令牌去调用Graph接口。
在.NET Core里,推荐用Microsoft.Identity.Web库来简化这个流程,不需要手动处理令牌交换逻辑:
- 先安装NuGet包:
Microsoft.Identity.Web和Microsoft.Identity.Web.MicrosoftGraph - 在
Startup.cs的ConfigureServices里修改认证配置:
services.AddMicrosoftIdentityWebApiAuthentication(Configuration) // 启用下游API令牌获取能力 .EnableTokenAcquisitionToCallDownstreamApi() // 添加Microsoft Graph服务 .AddMicrosoftGraph(Configuration.GetSection("MicrosoftGraph")) // 用内存缓存令牌(生产环境可以换成分布式缓存) .AddInMemoryTokenCaches();
- 在
appsettings.json里添加Graph的配置:
"MicrosoftGraph": { "BaseUrl": "https://graph.microsoft.com/v1.0", "Scopes": "Group.Read.All" }
之后在你的控制器里直接注入GraphServiceClient,它会自动完成OBO流程,帮你拿到Graph令牌并调用接口,比如:
private readonly GraphServiceClient _graphClient; public YourController(GraphServiceClient graphClient) { _graphClient = graphClient; } [Authorize(Policy = "GroupsCheck")] public async Task<IActionResult> GetUserGroups() { // 直接调用Graph获取当前用户的组 var groups = await _graphClient.Me.MemberOf.Request().GetAsync(); return Ok(groups); }
疑问2:获取当前登录用户的组时,应使用委派权限还是应用权限?
必须用委派权限(Delegated Permission),原因如下:
- 委派权限是以当前登录用户的身份去调用Graph,获取的是该用户实际属于的组(或者用户有权限查看的组),完全匹配你「获取当前登录用户的组」的需求;
- 应用权限是以你的Web API应用本身的身份去调用Graph,它能获取Azure AD中所有的组(只要权限足够),但这不是“当前用户关联的组”,而且应用权限的权限范围过大,不符合最小权限原则,也没法和当前登录用户的上下文关联起来。
另外要注意:你之前在Azure AD里给WebServicesAPP加的是Group.ReadAll应用权限,现在需要额外添加委派类型的Group.ReadAll权限,然后完成管理员同意,这样OBO流程才能获取到符合要求的Graph令牌。
内容的提问来源于stack exchange,提问作者Niranjan
相关产品推荐
相关产品推荐

