You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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. 当前实现思路是否正确,是否仅缺失正确权限?若缺失,所需权限是什么?
  2. 是否有其他实现方式?我曾尝试从声明中获取角色,但仅能得到用户的角色,而非应用注册中配置的所有角色。

解决方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 21:05:10