【问题标题】:Azure AD - Multi-Tenant with Daemon Service Authentication flow, what limits tenants from accessing other tenants users?Azure AD - 具有守护程序服务身份验证流的多租户,是什么限制租户访问其他租户用户?
【发布时间】:2017-02-09 10:09:47
【问题描述】:

我创建了一个服务/Dameon 应用程序来处理Microsoft Graph SDK 的身份验证过程。我几乎创建了一个HttpWebRequest 并创建了一个URL,我在我的应用程序的secretclient_id 中传递了一个URL,它生成了一个access_token。然后将此access_token 与 Microsoft Graph CSharp SDK 一起用于对 OneDrive for Business 进行身份验证。

我已经成功地为单个租户证明了这一点,它能够在文件和文件夹方面提取用户的所有 OneDrive 元数据。我的问题是,如果我想允许其他租户访问此应用程序,他们会看到哪些用户?

如果租户 A 创建了一个应用程序,该应用程序读取所有非全局管理员帐户以拉回 OneDrive for Business 元数据,并且 租户 B 有自己的非全局管理员帐户列表- 租户 B 希望从中读取的全局管理员帐户 - 限制 租户 B 只能访问他们自己的非全局用户列表的限制在哪里? p>

我唯一能想到的是租户 B 需要创建自己的 client_idsecret- 还有其他方法吗?

【问题讨论】:

    标签: azure daemon multi-tenant microsoft-graph-api azure-ad-graph-api


    【解决方案1】:

    我唯一能想到的就是租户 B 需要创建自己的 client_id 和 secret——还有其他方法吗?

    在应用程序可以通过 OAuth 2.0 协议与 Azure AD 交互之前,我们需要为目标租户创建相应的服务主体。当我们在 Azure 门户上注册应用程序时,门户已经在开发者的租户中为我们创建了服务主体

    如果我们正在开发多租户应用程序,则其他租户的用户需要授予权限。用户同意后,会在用户的租户中创建服务主体。

    所以另一种方式是,我们需要提供一种方式,使其他租户中的用户能够同意。例如,我们可以使用授权码授予流程。这里有一个例子供你参考(参考here):

    // Line breaks for legibility only
    
    https://login.microsoftonline.com/common/oauth2/authorize?
    client_id=6731de76-14a6-49ae-97bc-6eba6914391e
    &response_type=code
    &redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F
    &response_mode=query
    &resource=https%3A%2F%2Fservice.contoso.com%2F
    &state=12345
    

    在用户的租户上创建服务主体后,我们需要使用用户的租户来获取令牌,如下所示

    POST https://login.microsoftonline.com/{users' tenantId}/oauth2/token HTTP/1.1
    Content-Type: application/x-www-form-urlencoded
    
    grant_type=client_credentials
    &client_id=<clientId>
    &client_secret=<clientSecret>
    &resource=<resource>
    

    以下是一些有用的文档供您参考:

    Application and service principal objects in Azure Active Directory

    How to sign in any Azure Active Directory (AD) user using the multi-tenant application pattern

    【讨论】:

    • 它应该是第一次同意应用程序的管理员,以便创建主体。需要注意的是,如果应用只使用委派的权限,那么用户实际上只能访问其租户的数据。
    • @Fei Xue - MSFT,感谢您的回答。也许你可以为我解开一些困惑。我创建了一个 URL 来生成 authorization_code 并以管理员身份登录并授予权限。我应该期望在应用程序部分看到被授予权限的应用程序吗?我没有在那里显示任何东西?
    • 是的,当用户授予权限时,它应该同时显示委托权限和应用程序权限。为了确保该应用程序之前未在该租户中获得同意,我们可以通过在发送请求时附加参数 prompt=consent 来强制显示同意。
    猜你喜欢
    • 2020-08-26
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 2019-01-08
    • 2019-11-12
    • 2015-10-04
    相关资源
    最近更新 更多