如何通过Microsoft GraphServiceClient检查用户权限许可与范围
借助GraphServiceClient检查用户已授予的权限/范围
可以通过两种方式实现,分别适配不同场景:
方法一:调用Microsoft Graph的/me/permissions端点(委派权限场景)
这个端点会返回当前用户授予应用的所有委派权限,包括用户自主同意或管理员代其同意的权限。
实现步骤
- 确保
GraphServiceClient已通过用户身份完成认证(比如基于OAuth2授权码流程获取的令牌)。 - 调用
Me.Permissions接口拉取权限列表,再过滤出目标权限进行校验。
C#代码示例
using Microsoft.Graph; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; public async Task<bool> VerifyUserPermissionsAsync(GraphServiceClient graphClient) { var targetPermissions = new List<string> { "User.Read", "Calendar.ReadWrite.Shared" }; var userPermissions = await graphClient.Me.Permissions.Request().GetAsync(); var grantedPermissions = userPermissions.Select(p => p.Permission).ToList(); // 校验所有目标权限是否已授予 return targetPermissions.All(perm => grantedPermissions.Contains(perm)); }
方法二:解析访问令牌的scp声明
访问令牌的scp字段包含当前会话中应用实际拥有的权限范围,这种方式无需额外调用Graph API,性能更优。
实现步骤
- 获取当前请求的访问令牌(可从认证上下文或请求头中提取)。
- 使用
System.IdentityModel.Tokens.Jwt库解析令牌,提取scp声明的值。 - 拆分
scp值为权限列表,检查是否包含目标范围。
C#代码示例
using System.IdentityModel.Tokens.Jwt; using System.Linq; public bool ValidateTokenScopes(string accessToken) { var targetScopes = new List<string> { "User.Read", "Calendar.ReadWrite.Shared" }; var handler = new JwtSecurityTokenHandler(); if (handler.CanReadToken(accessToken)) { var jwtToken = handler.ReadJwtToken(accessToken); var scpClaim = jwtToken.Claims.FirstOrDefault(c => c.Type == "scp"); if (scpClaim != null) { var grantedScopes = scpClaim.Value.Split(' ').ToList(); return targetScopes.All(scope => grantedScopes.Contains(scope)); } } return false; }
两种方法的差异
/me/permissions返回用户授予应用的全部权限(含管理员预同意的),但无法区分当前会话实际生效的权限。- 解析令牌
scp声明得到的是当前会话中应用实际拥有的权限范围,更贴合当前请求的权限状态。
内容的提问来源于stack exchange,提问作者Adrien Ruffie
相关产品推荐
相关产品推荐

