来自另一个租户的用户的 Azure AD、多租户、应用程序角色分配

时间:2021-04-26 20:34:34

标签: azure azure-active-directory azure-ad-graph-api

我正在开发包含客户端(SPA、angular 9)和后端(WebAPI、ASP.NET Core 3.0)的 Web 应用程序。决定使用应用程序角色功能在我们的应用程序中授权用户。我需要能够通过 MSFT Graph API 从我们的应用程序 UI 管理用户的应用程序角色分配。

  1. 我在 Azure AD TenantA 中注册了 MyAuthApp 应用程序。并在那里创建了多个应用角色。

身份验证工作正常。客户端获取令牌并将其附加到后端的 http 请求。授权也很好用,我可以从令牌中提取应用程序角色并验证它们。

为来自其他 AzureAD 租户的用户添加应用程序角色分配的问题 - TenantB。由于 GraphApiAuthTenantA 中注册,GraphServiceClient 配置似乎存在问题。

问题:是否可以使用 TenantA 中的 Client Credentials 授权的 GraphServiceClient 为来自 TenantB 的用户添加应用程序角色分配? 现在,当我添加角色分配时,我收到了异常,例如未找到某些 Guid 的资源。此资源是一个用户(来自 TenantB)。 这是一段添加用户应用程序角色分配的代码。我在 GetGraphServiceClient 函数中看到了可能的问题。它用作带有 TenantA Id 的授权 URL。

public async Task<AppRoleAssignment> AssignAppRoleToUser(Guid userId, Guid appRoleId)
        {
            var graphClient = await this.graphClientProvider.GetGraphServiceClient();

            return await graphClient.Users[userId.ToString()].AppRoleAssignments.Request().AddAsync(
                new AppRoleAssignment()
                {
                    PrincipalId = userId,
                    AppRoleId = appRoleId,
                    ResourceId = this.graphAppSettingsProvider.GetAppRoleResourceIdAsGuid()
                });
        }

Exception i have

df0b3e71-fd2d-41a4-bfa9-0310b31395ae 是租户 B 的用户 ID。

更新:经过进一步调查,我能够为 TenantB 的用户分配应用程序角色。但我不得不更改返回 GraphServiceClient 的代码中的设置,并提供 TenantB Id 和来自 TenantB 的应用程序服务主体 Id(而不是来自 TenantA 的值)。但这是一个问题。我们希望能够为来自任何租户的用户分配应用程序角色,如果我们必须为每个租户分别提供 TenantId 和 Service Principal Id,这是不可行的。 是否可以通过一些常用设置来执行此操作? 这就是我获得 GraphServiceClient 的方式:

public async Task<GraphServiceClient> GetGraphServiceClient()
        {
            var clientId = this.graphAppSettingsProvider.GetClientId();
            var clientSecret = this.graphAppSettingsProvider.GetClientSecret();
            var tenantId = this.graphAppSettingsProvider.GetTenant();

            var app = ConfidentialClientApplicationBuilder.Create(clientId)
                .WithClientSecret(clientSecret)
                .WithTenantId(tenantId)
                .Build();

            string[] scopes = {"https://graph.microsoft.com/.default"};
            return new GraphServiceClient(
                "https://graph.microsoft.com/v1.0",
                new DelegateAuthenticationProvider((requestMessage) =>
                {
                    var ar = app.AcquireTokenForClient(scopes).ExecuteAsync();
                    requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", ar.Result.AccessToken);
                    return Task.FromResult(0);
                }));
        }

更新 2 更改了一些要求,现在我们只需要为当前用户租户中的用户管理应用程序角色列表。因此,我们将权限类型从 Application 更改为 Delegated 以代表经过身份验证的用户。 正如我之前所说,我们拥有与 ASP.NET Core WebAPI 后端配对的 Angular 应用程序。 Angular 应用程序获取访问令牌并将其发送到 Authorizaiton 标头中的后端。当我将访问令牌附加到 GraphServiceClient 请求(标头)时,出现错误“访问令牌验证失败。无效的受众。” 问题:使用来自客户端的访问令牌进行 Graph API 请求的流程是否正确,还是我应该在后端使用来自客户端的访问令牌获取新的 Graph API 访问令牌?

感谢任何帮助/想法。提前致谢!

1 个答案:

答案 0 :(得分:0)

首先,您需要将 MyAuthApp 应用程序设置为多租户应用程序

enter image description here

接下来,在浏览器中运行admin同意url,然后需要用其他租户的管理员账号登录并同意。然后,多租户应用程序将作为企业应用程序 添加到目标租户中。 https://login.microsoftonline.com/common/adminconsent?client_id={client-id}

同时,您在租户 A 中创建的应用角色也会同步到目标租户(例如租户 B)。接下来只需通过租户B的Azure门户或使用ms graph api将MyAuthApp的应用角色授予租户B的用户即可。

enter image description here