如何使用个人 Microsoft 帐户通过 Azure AD 多租户应用程序访问 AzureRM?
How to acces AzureRM with a AzureAD Multi-Tenant App using personal Microsoft account?
我的目标很简单:使用 Azure AD 多租户应用程序能够在其他租户上调用 Azure 资源管理器 API。但是,当您使用个人 Microsoft 帐户登录时,我不知道如何操作。
- 我使用公司的租户创建了一个 Azure AD 多租户应用
- 然后创建了一个测试 ASP.NET 核心 Web 应用程序,它进入这样的 URL:
- Microsoft 的登录页面出现,我可以使用 个人 LIVE.COM 成功登录,其中测试 Web 应用程序接收带有给定重定向的回调URL。我有另一个使用我的个人 MS 帐户创建的 Azure 租户,我正在尝试访问它。
- 多租户 AAD 应用已添加到 https://account.live.com/consent/Manage 的 "personal space",但未添加到 Azure AD 租户。
从技术角度来看这可能是有道理的,但是如何在使用个人帐户登录时将 AAD 应用程序添加到另一个租户?
我认为 "authorize" URL 必须包含 AAD 租户 name/ID 而不是 "common" (确认在目标租户上创建了服务主体):
但是,那个租户name/ID在用户登录时是未知的,我真的不知道用什么API来查询它。
应该手动完成 - 检测个人 MS 帐户并找到与 AAD 租户的关联,或者是否有 API 可以帮助完成此操作?在这两种情况下,如何?如果一个帐户与多个租户关联(Azure 门户中的 "Switch Directory")怎么办?
P.S。使用 URLs https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize
("orgainzations" 而不是 "common")或 https://login.microsoftonline.com/common/oauth2/authorize
(没有 "v2.0")将不允许使用个人 MS 帐户登录。
更新
为了演示该问题,进行了 4 次测试以使用多租户应用程序访问资源“https://management.azure.com/”:
使用 v1 端点授权 Microsoft 的 "Microsoft Azure" 应用程序 - 它适用于个人帐户:
https://login.microsoftonline.com/common/oauth2/authorize?client_id=1950a258-227b-4e31-a9cf-717495945fc2&response_type=code&response_mode=form_post&resource=https://management.azure.com/&nonce=123&state=common&redirect_uri=http%3A%2F%2Flocalhost%3A64696%2FAuthCallback
使用 v2 端点授权同一个 "Microsoft Azure" 应用程序 - 现在它不允许使用个人帐户:
https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=1950a258-227b-4e31-a9cf-717495945fc2&response_type=code&response_mode=form_post&scope=https://management.azure.com/.default&nonce=123&state=common&redirect_uri=http%3A%2F%2Flocalhost%3A64696%2FAuthCallback
针对 v1 端点授权自定义多租户应用程序(插入您的客户端 ID)- 显示错误 AADSTS50020 "User account 'user@live.com' from identity provider 'live.com' does not exist in tenant 'contoso.com' and cannot access the application ''(app name) in that tenant. The account needs to be added as an external user in the tenant first. Sign out and sign in again with a different Azure Active Directory user account."
https://login.microsoftonline.com/common/oauth2/authorize?client_id=&response_type=code&response_mode=form_post&resource=https://management.azure.com/&nonce=123&state=common&redirect_uri=http%3A%2F%2Flocalhost%3A64696%2FAuthCallback
针对 v2 端点授权自定义多租户应用程序 - 与测试 #2 相同 - 不允许个人帐户。
想法。
- v2 端点不允许资源的个人帐户 https://management.azure.com/,而 v1 端点允许。
- Microsoft Azure 应用程序可能有一个清单,其中包含未记录或硬编码的设置,允许将个人帐户用于所需资源。
回答
长话短说,根据 Microsoft 的规定,一般 public 是不可能的。
只有V2.0端点支持个人账户(即使不属于任何Azure AD租户)登录。
It works with personal account when you use v1.0 endpoint.
那是因为该个人帐户属于至少一个 Azure AD 租户。那么这个个人账号就会被识别为租户中的来宾用户。
The v2 endpoint does not allow personal accounts for the resource
https://management.azure.com/
是的,如果您在使用v2.0端点时使用个人账户登录,它会检测到您属于个人账户并将您重定向到个人账户登录端点https://login.live.com/oauth20_authorize.srf
。
使用v2.0端点时,必须识别租户才能使用个人账号登录
https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize?
client_id=20244877-ae8f-4325-b4cf-c6dc239cb124
&response_type=code
&redirect_uri=https://localhost
&response_mode=fragment
&scope=https://management.azure.com/.default
&state=12345
&nonce=default
然后你可以调用https://management.azure.com/tenants?api-version=2016-06-01
列出该账号所属的所有租户。
更新:
It is normal that you can't do that. You are not telling Azure AD that
the which tenant the MSA user is an external user, so Azure AD is
making a guess and checking in the tenant where the app is registered
(tenant A). If you expect external users to be able to sign in, you
must specify the tenant where the guest has previously been invited to
(e.g. tenant B).
我的目标很简单:使用 Azure AD 多租户应用程序能够在其他租户上调用 Azure 资源管理器 API。但是,当您使用个人 Microsoft 帐户登录时,我不知道如何操作。
- 我使用公司的租户创建了一个 Azure AD 多租户应用
- 然后创建了一个测试 ASP.NET 核心 Web 应用程序,它进入这样的 URL:
- Microsoft 的登录页面出现,我可以使用 个人 LIVE.COM 成功登录,其中测试 Web 应用程序接收带有给定重定向的回调URL。我有另一个使用我的个人 MS 帐户创建的 Azure 租户,我正在尝试访问它。
- 多租户 AAD 应用已添加到 https://account.live.com/consent/Manage 的 "personal space",但未添加到 Azure AD 租户。
从技术角度来看这可能是有道理的,但是如何在使用个人帐户登录时将 AAD 应用程序添加到另一个租户?
我认为 "authorize" URL 必须包含 AAD 租户 name/ID 而不是 "common" (确认在目标租户上创建了服务主体):
应该手动完成 - 检测个人 MS 帐户并找到与 AAD 租户的关联,或者是否有 API 可以帮助完成此操作?在这两种情况下,如何?如果一个帐户与多个租户关联(Azure 门户中的 "Switch Directory")怎么办?
P.S。使用 URLs https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize
("orgainzations" 而不是 "common")或 https://login.microsoftonline.com/common/oauth2/authorize
(没有 "v2.0")将不允许使用个人 MS 帐户登录。
更新
为了演示该问题,进行了 4 次测试以使用多租户应用程序访问资源“https://management.azure.com/”:
使用 v1 端点授权 Microsoft 的 "Microsoft Azure" 应用程序 - 它适用于个人帐户: https://login.microsoftonline.com/common/oauth2/authorize?client_id=1950a258-227b-4e31-a9cf-717495945fc2&response_type=code&response_mode=form_post&resource=https://management.azure.com/&nonce=123&state=common&redirect_uri=http%3A%2F%2Flocalhost%3A64696%2FAuthCallback
使用 v2 端点授权同一个 "Microsoft Azure" 应用程序 - 现在它不允许使用个人帐户: https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=1950a258-227b-4e31-a9cf-717495945fc2&response_type=code&response_mode=form_post&scope=https://management.azure.com/.default&nonce=123&state=common&redirect_uri=http%3A%2F%2Flocalhost%3A64696%2FAuthCallback
针对 v1 端点授权自定义多租户应用程序(插入您的客户端 ID)- 显示错误 AADSTS50020 "User account 'user@live.com' from identity provider 'live.com' does not exist in tenant 'contoso.com' and cannot access the application ''(app name) in that tenant. The account needs to be added as an external user in the tenant first. Sign out and sign in again with a different Azure Active Directory user account." https://login.microsoftonline.com/common/oauth2/authorize?client_id=&response_type=code&response_mode=form_post&resource=https://management.azure.com/&nonce=123&state=common&redirect_uri=http%3A%2F%2Flocalhost%3A64696%2FAuthCallback
针对 v2 端点授权自定义多租户应用程序 - 与测试 #2 相同 - 不允许个人帐户。
想法。
- v2 端点不允许资源的个人帐户 https://management.azure.com/,而 v1 端点允许。
- Microsoft Azure 应用程序可能有一个清单,其中包含未记录或硬编码的设置,允许将个人帐户用于所需资源。
回答
长话短说,根据 Microsoft 的规定,一般 public 是不可能的。
只有V2.0端点支持个人账户(即使不属于任何Azure AD租户)登录。
It works with personal account when you use v1.0 endpoint.
那是因为该个人帐户属于至少一个 Azure AD 租户。那么这个个人账号就会被识别为租户中的来宾用户。
The v2 endpoint does not allow personal accounts for the resource https://management.azure.com/
是的,如果您在使用v2.0端点时使用个人账户登录,它会检测到您属于个人账户并将您重定向到个人账户登录端点https://login.live.com/oauth20_authorize.srf
。
使用v2.0端点时,必须识别租户才能使用个人账号登录
https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize?
client_id=20244877-ae8f-4325-b4cf-c6dc239cb124
&response_type=code
&redirect_uri=https://localhost
&response_mode=fragment
&scope=https://management.azure.com/.default
&state=12345
&nonce=default
然后你可以调用https://management.azure.com/tenants?api-version=2016-06-01
列出该账号所属的所有租户。
更新:
It is normal that you can't do that. You are not telling Azure AD that the which tenant the MSA user is an external user, so Azure AD is making a guess and checking in the tenant where the app is registered (tenant A). If you expect external users to be able to sign in, you must specify the tenant where the guest has previously been invited to (e.g. tenant B).