【发布时间】:2021-07-20 05:32:21
【问题描述】:
我正在开发包含客户端(SPA,角度 9)和后端(WebAPI,ASP.NET Core 3.0)的 Web 应用程序。决定使用应用程序角色功能来授权我们应用程序中的用户。而且我需要能够通过 MSFT Graph API 从我们的应用程序 UI 管理用户的应用程序角色分配。
- 我在 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