[英]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 管理用户的应用程序角色分配。
身份验证工作正常。 客户端获取令牌并将其附加到 http 请求到后端。 授权也可以正常工作,我可以从令牌中提取应用角色并验证它们。
为其他 AzureAD 租户 - TenantB的用户添加应用程序角色分配时出现问题。 由于GraphApiAuth在TenantA中注册,似乎 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 的新访问令牌?
任何帮助/想法表示赞赏。 提前致谢!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.