在ASP.NET MVC Core中获取Azure AD应用注册的所有AppRoles
问题描述
在我的ASP.NET MVC Core项目中,需要获取Azure AD应用注册中配置的所有AppRoles列表并在视图中展示。我尝试了以下代码:
var servicePrincipal = await _graphServiceClient.Applications[_configuration["AzureAd:AppRegistrationId"]] .Request() .Select("appRoles") .GetAsync();
已为应用授予Application.Read.All和Directory.Read.All API权限,但仍报错:
ServiceException: Code: Authorization_RequestDenied
Message: Insufficient privileges to complete the operation
疑问:
- 当前实现思路是否正确,是否仅缺失正确权限?若缺失,所需权限是什么?
- 是否有其他实现方式?我曾尝试从声明中获取角色,但仅能得到用户的角色,而非应用注册中配置的所有角色。
解决方案
1. 实现思路与权限问题
你的实现思路是正确的,但权限配置可能存在以下问题:
- 权限类型验证:确保你授予的
Application.Read.All是应用权限(而非委托权限),因为后端服务是以应用身份调用Graph API,而非用户上下文。委托权限依赖用户登录,应用权限允许服务独立访问资源。 - 权限授予状态:确认权限已经被管理员同意。即使添加了权限,未经过全局管理员或特权角色管理员的同意,应用仍无法实际使用这些权限。
- 冗余权限清理:
Directory.Read.All并非必需,Application.Read.All应用权限本身已允许读取应用注册的appRoles属性,可移除该冗余权限。
2. 其他实现方式
除了调用Microsoft Graph API,还有两种可行方案:
方式一:本地配置文件存储(适用于角色变动频率低的场景)
如果AppRoles不经常变更,可直接将角色列表写入appsettings.json,在项目中直接读取:
// appsettings.json "AzureAd": { "AppRoles": [ { "Id": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "Name": "Admin", "Description": "Full access to the application" }, { "Id": "yyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy", "Name": "User", "Description": "Limited access to the application" } ] }
代码中通过IConfiguration读取:
var appRoles = _configuration.GetSection("AzureAd:AppRoles").Get<List<AppRole>>();
该方案无需调用外部API,性能更优,但需手动同步AppRoles的变更。
方式二:使用Azure AD PowerShell模块预取(适用于运维场景)
如果需要批量或定期同步角色,可通过Azure AD PowerShell模块提前导出AppRoles,再导入到项目配置或数据库中:
Get-AzureADApplication -Filter "AppId eq '你的应用ID'" | Select-Object -ExpandProperty AppRoles
将输出结果持久化后,项目直接读取本地存储的角色数据即可。
内容的提问来源于stack exchange,提问作者Marc H
相关产品推荐
相关产品推荐

