我正在开发包含客户端(SPA、angular 9)和后端(WebAPI、ASP.NET Core 3.0)的 Web 应用程序。决定使用应用程序角色功能在我们的应用程序中授权用户。我需要能够通过 MSFT Graph API 从我们的应用程序 UI 管理用户的应用程序角色分配。
身份验证工作正常。客户端获取令牌并将其附加到后端的 http 请求。授权也很好用,我可以从令牌中提取应用程序角色并验证它们。
为来自其他 AzureAD 租户的用户添加应用程序角色分配的问题 - TenantB。由于 GraphApiAuth 在 TenantA 中注册,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()
});
}
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 访问令牌?
感谢任何帮助/想法。提前致谢!