【问题标题】:Web API manages different tenants using Microsoft Graph APIWeb API 使用 Microsoft Graph API 管理不同的租户
【发布时间】:2020-05-11 19:43:32
【问题描述】:

我已经注册了多租户应用程序并使用仅限应用程序的身份,但我们有多个租户,我们想使用不同租户的数据(获取用户等)。我们有 Web 应用程序使用哪个新租户管理员首次登录并授予我们的 Web 应用程序访问其数据的权限。

现在我们想要获取他们的用户,但问题是,在我配置 appsettings.json 的 web api 中,我为一个租户(我注册 web 应用程序的地方)进行了配置,我们需要编写通用代码接受不同的租户 ID 并为该租户创建他们的 graphserviceclient,然后我将使用 graphserviceclient.users 来获取他们的租户用户。
如何在我的 webApi 中概括这一点?

如果我放置另一个租户 ID 并为他们的租户创建 graphServiceClient,我可以获取其他租户的数据,但是我必须对租户 ID 进行硬编码(并确保租户管理员允许权限), 我需要一个通用的解决方案。(而且我们不想使用委托身份)

【问题讨论】:

  • 您是否要使用客户端证书流(docs.microsoft.com/en-us/azure/active-directory/develop/…) 在您的 Web API 中调用 Microsoft graph?
  • 是的,我正在使用客户端凭据流。但是新租户将通过 Web 应用程序注册,我想在我的 webAPI 中注册该租户实例,即通过提供租户 id 和我的应用程序 cient id 和客户端密码为该租户创建一个 graphServiceClient。我想要一个通用的设计。
  • 您能告诉我为什么需要客户端证书流吗?在正常情况下,在多租户应用程序中,我们应该使用 Delegated Identity。
  • 因为我们需要自己管理租户数据,这是需求之一。在我的场景中需要它,而委托身份无法满足我需要的场景。
  • manage the tenants data ourself 是什么意思?如果你只是使用 Delegated 身份,其他租户用户也无法管理你的租户数据。

标签: azure azure-active-directory microsoft-graph-api microsoft-graph-sdks


【解决方案1】:

你需要做client credentials。您必须以最简单的形式(主要是手动):

  1. 预配多租户应用程序,在每个目标租户中创建一个服务主体。例如:
    New-AzureADServicePrincipal -AppId {multi tenant app id}
  2. 以交互方式,授予管理员同意每个租户中预配的多租户应用程序的权限:https://login.microsoftonline.com/{target tenant id}/adminconsent?client_id={multi tenant app id}
  3. 为每个创建的服务主体创建一个客户端密码:
    New-AzureADServicePrincipalPasswordCredential -ObjectId {provisioned multi tenant app service principal object id} -CustomKeyIdentifier {identifier} -StartDate (Get-Date) -EndDate (Get-Date).AddDays(1) -Value {secret}

在 auth 实现中执行类似的操作来获取特定于租户的令牌并将其传递给图形客户端调用:

var app = ConfidentialClientApplicationBuilder.Create({multi tenant app id})
           .WithAuthority(AzureCloudInstance.AzurePublic, {target tenant id})
           .WithClientSecret({provisioned multi tenant app service principal secret})
           .Build();

var result = await app.AcquireTokenForClient("htps://graph.microsoft.com/.default")
                   .ExecuteAsync();

因此,基本上使用tenantId 将目标租户的特定详细信息定位为客户端机密(或者,再次,客户端凭据)。差不多就这些了。

【讨论】:

  • 我想概括一下设计,如果新租户来到我们的 Web 应用程序,他们会提供他们的租户信息并征得管理员同意,然后新的 graphserviceclient 对象会自动注册到我们的 Web 应用程序(Web api)中这样我们就可以使用我们的 Web 应用程序(Web api)调用新的租户信息。我想要通用设计。
  • 请阅读帖子中的cmets。你会明白我在说什么。非常感谢。
  • 你能详细说明一下这里的泛化包含什么或者你想要实现什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 2020-09-19
相关资源
最近更新 更多