获取Azure AD应用程序上的所有appRoles在ASP.NET中注册

ycl3bljg  于 2023-06-24  发布在  .NET
关注(0)|答案(3)|浏览(143)

在我的ASP.NETMVC核心项目中,我希望在AppRegistration中设置的所有AppRoles作为列表显示在我的视图中。
目前,我尝试了以下几点:

var servicePrincipal = await _graphServiceClient.Applications[_configuration["AzureAd:AppRegistrationId"]]
            .Request()
            .Select("appRoles")
            .GetAsync();

我已经授予了应用程序的API权限Application.Read.AllDirectory.Read.All,但我仍然得到错误:
服务异常:代码:Authorization_RequestDenied
消息:权限不足,无法完成操作
问题:

  • 我是否甚至在正确的道路上实现我想要的东西,只是错过了正确的许可?
  • 有谁知道需要什么许可吗?
  • 是否有其他方法来完成这项任务?
  • 我已经尝试从声明中获取角色,但这只显示了用户的角色,而不是在应用程序注册中设置的所有角色

提前感谢您的任何帮助!

amrnrhlw

amrnrhlw1#

看来我迟到了...
我用委托权限和应用程序权限进行了测试,两者都可以。
对于应用程序权限,可以很容易地使用如下代码:

using Microsoft.Graph;
using Azure.Identity;

var scopes = new[] { "https://graph.microsoft.com/.default" };
var tenantId = "tenantId ";
var clientId = "clientId ";
var clientSecret = "clientSecret ";
var clientSecretCredential = new ClientSecretCredential(
                            tenantId, clientId, clientSecret);
var graphClient = new GraphServiceClient(clientSecretCredential, scopes);

var res = await graphClient.Applications["azure_ad_app_object_id_instead_of_client_id"].Request().GetAsync();
var roles = res.AppRoles;

这需要API权限的应用程序类型:

如果我们想使用委托的API权限,因为这是一个MVC应用程序,我们需要首先将AAD身份验证集成到应用程序中。我们可以按照这个样本。一般来说,在program.cs中添加代码如下:
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(builder.Configuration) .EnableTokenAcquisitionToCallDownstreamApi() .AddMicrosoftGraph(builder.Configuration.GetSection("DownstreamApi")) .AddInMemoryTokenCaches();

builder.Services.AddControllersWithViews(options =>
{
    var policy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();
    options.Filters.Add(new AuthorizeFilter(policy));
}).AddMicrosoftIdentityUI();

"AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "TenantId",
    "TenantId": "TenantId",
    "ClientId": "ClientId",
    "ClientSecret": "ClientSecret",
    "CallbackPath": "/home", //don't forget to set redirect url in azure portal
    "SignedOutCallbackPath ": "/signout-callback-oidc"
  },

然后将graphclient注入到代码中并使用它调用图API,

private readonly GraphServiceClient _graphServiceClient;

public HomeController(GraphServiceClient graphServiceClient)
{
    _graphServiceClient = graphServiceClient;
}

public async Task<IActionResult> IndexAsync() {
    var b = await _graphServiceClient.Applications["aad_app_object_id"].Request().GetAsync();
    return View();
}

f3temu5u

f3temu5u2#

根据文档hereApplication.Read.All是读取应用程序信息的正确权限。
我相信你得到这个错误的原因是因为你已经将这个权限分配给了你的应用程序,但是似乎发出Graph API请求的用户没有这个权限。
请检查分配给发出请求的用户的权限,并确保他们具有发出此请求的相应权限。

kwvwclae

kwvwclae3#

虽然这不是对我最初问题的直接回答,但我通过使用不同的方法来解决这个问题。
我使用Microsoft.Graph.Auth包生成一个凭证,然后使用该凭证连接到Graph(基本上作为我的应用程序注册连接)。函数如下:

public async Task<List<string>> GetGraphApiClient(IConfiguration configuration)
    {
        // Configure application
        var clientApplication = ConfidentialClientApplicationBuilder
            .Create(configuration["AzureAd:ClientId"])
            .WithTenantId(configuration["AzureAd:TenantId"])
            .WithClientSecret(configuration["AzureAd:ClientSecret"])
            .Build();

        // Create ClientCredentialProvider that will manage auth token for you
        var authenticationProvider = new ClientCredentialProvider(clientApplication);
        var graphClient = new GraphServiceClient(authenticationProvider);

        // Call Graph API
        var application = await graphClient.Applications[<"Application object ID here">].Request().GetAsync();

        List<string> appRoles = new List<string>();
        foreach (var app in application.AppRoles)
        {
            appRoles.Add(app.DisplayName);
        }
        return appRoles;
    }

可能不是最好的方式,但工作,所以我很高兴。

相关问题