繁体   English   中英

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

[英]Azure AD, Multi-tenant, App Roles Assignment for users from another tenant

我正在开发包含客户端(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中的客户端凭据授权的 GraphServiceClient 为来自TenantB的用户添加应用程序角色分配? 现在,当我添加角色分配时,我遇到了一些异常,比如找不到一些 Guid 的资源。 此资源是用户(来自TenantB )。 这是一段添加用户应用角色分配的代码。 我在 GetGraphServiceClient function 中看到了可能的问题。 它使用带有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()
                });
        }

我有例外

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

更新:经过进一步调查,我能够从TenantB为用户分配 App 角色。 但是我必须更改返回 GraphServiceClient 的代码中的设置,并从TenantB提供TenantB Id 和 Application Service Principal Id(而不是来自TenantA的值)。 但这是个问题。 我们希望能够为任何租户的用户分配应用程序角色,如果我们必须分别为每个租户提供 TenantId 和服务主体 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 以代表经过身份验证的用户。 正如我之前所说,我们有 Angular 应用程序与 ASP.NET 核心 WebAPI 后端配对。 Angular 应用程序获取访问令牌并将其发送到 Authorizaiton header 中的后端。 当我将访问令牌附加到 GraphServiceClient 请求(标头)时,我收到错误“访问令牌验证失败。无效的受众。” 问题:对于 Graph API 请求使用来自客户端的访问令牌是正确的流程,还是我应该使用来自客户端的访问令牌在后端获取 Graph API 的新访问令牌?

任何帮助/想法表示赞赏。 提前致谢!

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

在此处输入图像描述

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

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

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM