【问题标题】:Azure AD, Multi-tenant, App Roles Assignment for users from another tenant为其他租户的用户分配 Azure AD、多租户、应用角色分配
【发布时间】:2021-07-20 05:32:21
【问题描述】:

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

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

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

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

问题:这是否可以使用 TenantA 中的客户端凭据授权的 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()
                });
        }

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 Core WebAPI 后端配对。 Angular 应用程序获取访问令牌并将其发送到 Authorizaiton 标头中的后端。当我将访问令牌附加到 GraphServiceClient 请求(标头)时,我收到错误“访问令牌验证失败。无效的受众。” 问题:这是使用来自客户端的访问令牌进行 Graph API 请求的正确流程,还是我应该使用来自客户端的访问令牌在后端为 Graph API 获取新的访问令牌?

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

【问题讨论】:

  • 您在分配应用角色时遇到了哪些问题?考虑将应用角色分配给企业应用程序(在其他租户中),您应该能够做到。请编辑您的问题并提供更多详细信息。
  • @GauravMantri 感谢您的关注。我在问题中添加了更多细节。主要问题是这可以通过 GraphClientService 为来自另一个租户的用户添加应用程序角色分配,并使用另一个租户中的客户端凭据进行自动化。

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


【解决方案1】:

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

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

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

【讨论】:

  • 你好@Carl Zhao 我做到了。如果我手动执行此操作,它工作正常。我的问题与 Graph API 调用和以编程方式设置应用角色分配有关。
  • @dskibin 你遇到了什么错误?请提供详细的错误信息。
  • 找不到具有 Guid 的资源。 Guid 是用户的 ID。 @Carl Zhao我的问题是,是否可以通过租户 B 中授权的图形客户端为租户 B 的用户分配应用程序角色?
  • @dskibin 你在用这个api吗? docs.microsoft.com/en-us/graph/api/…
  • @dskibin 你的意思是app角色可以在租户B的门户中授予用户,但是使用graph api时报错?这很奇怪。您确定用户在租户 B 中吗?能否检查租户 B 中的用户并确保 guid 是用户的对象 id?
猜你喜欢
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
  • 1970-01-01
  • 2019-11-12
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
  • 1970-01-01
相关资源
最近更新 更多