Azure AD - 具有守护进程服务和授权代码授予流程的多租户,目标租户能否生成 client_secret?
Azure AD - Multi-Tenant with Daemon Service and Authorization Code Grant flow, can a target tenant generate a client_secret?
我正在通过 OAuth 2.0 协议使用 Azure AD,并且还创建了一个服务/Dameon 应用程序来处理 Microsoft Graph SDK
的身份验证过程。对于 service/daemon,我创建一个 HttpWebRequest
并传递 client_id
和 client_secret
生成一个 access_token
,然后我可以在其中提供给 Microsoft Graph SDK
.
我还成功地为目标租户创建了相应的服务主体,其中管理员已使用授权代码授予[=]向应用程序授予权限 流量。该应用程序然后显示在 Overview -> Quick tasks -> Find an enterprise app
中,位于 (portal.azure.com).
中
我的问题是有一种方法可以利用 service/daemon 方法,同时还允许目标租户的管理员授权应用程序,这将允许目标租户创建 client_secret
传递哪个对 that 租户来说是唯一的?
简短的回答是否定的。当管理员同意您的 multi-tenant 应用时:
- 在他们的租户中为其创建服务主体
- 应用程序请求的权限在该租户中被授予
这意味着您的应用现在也可以使用其客户端凭据(id + 密码)针对其租户进行身份验证。因此,相同的密钥适用于所有批准的租户。
这意味着您的应用程序可以在任何给定时间免费获取其中任何一个的访问令牌,无论谁登录。因此,您的应用程序有责任保持数据分离。
如果您从 https://login.microsoftonline.com/company.com/oauth2/token
获得访问令牌,生成的令牌将包含该租户的标识符。而像 Microsoft Graph API 这样的 API 只会为您提供具有该令牌的租户的数据。因此,您的应用必须确保仅使用租户 ID 等于用户的租户 ID 声明的令牌。
我会说 juunas 的回答是 99% 正确的。简短的回答基本没有,而且他提到的考虑也很扎实。
但我相信,在某些考虑下,这在技术上是可行的。当管理员同意您的守护程序服务时,将在您客户的租户中创建一个服务主体。服务主体确实允许添加可在 per-tenant 基础上用作客户端机密的凭据。问题是,实际上没有办法从您的应用程序以编程方式向服务主体添加凭据。您必须让管理员使用 运行 一些脚本来将新凭据添加到他们租户的服务主体中。
即使您经历了所有这些,您也需要确保您的服务也在 customer/tenant 基础上隔离。 Security-wise,如果您的单个守护程序可以访问所有机密,则创建 per-tenant 客户端机密有点毫无意义。
我正在通过 OAuth 2.0 协议使用 Azure AD,并且还创建了一个服务/Dameon 应用程序来处理 Microsoft Graph SDK
的身份验证过程。对于 service/daemon,我创建一个 HttpWebRequest
并传递 client_id
和 client_secret
生成一个 access_token
,然后我可以在其中提供给 Microsoft Graph SDK
.
我还成功地为目标租户创建了相应的服务主体,其中管理员已使用授权代码授予[=]向应用程序授予权限 流量。该应用程序然后显示在 Overview -> Quick tasks -> Find an enterprise app
中,位于 (portal.azure.com).
我的问题是有一种方法可以利用 service/daemon 方法,同时还允许目标租户的管理员授权应用程序,这将允许目标租户创建 client_secret
传递哪个对 that 租户来说是唯一的?
简短的回答是否定的。当管理员同意您的 multi-tenant 应用时:
- 在他们的租户中为其创建服务主体
- 应用程序请求的权限在该租户中被授予
这意味着您的应用现在也可以使用其客户端凭据(id + 密码)针对其租户进行身份验证。因此,相同的密钥适用于所有批准的租户。
这意味着您的应用程序可以在任何给定时间免费获取其中任何一个的访问令牌,无论谁登录。因此,您的应用程序有责任保持数据分离。
如果您从 https://login.microsoftonline.com/company.com/oauth2/token
获得访问令牌,生成的令牌将包含该租户的标识符。而像 Microsoft Graph API 这样的 API 只会为您提供具有该令牌的租户的数据。因此,您的应用必须确保仅使用租户 ID 等于用户的租户 ID 声明的令牌。
我会说 juunas 的回答是 99% 正确的。简短的回答基本没有,而且他提到的考虑也很扎实。
但我相信,在某些考虑下,这在技术上是可行的。当管理员同意您的守护程序服务时,将在您客户的租户中创建一个服务主体。服务主体确实允许添加可在 per-tenant 基础上用作客户端机密的凭据。问题是,实际上没有办法从您的应用程序以编程方式向服务主体添加凭据。您必须让管理员使用 运行 一些脚本来将新凭据添加到他们租户的服务主体中。
即使您经历了所有这些,您也需要确保您的服务也在 customer/tenant 基础上隔离。 Security-wise,如果您的单个守护程序可以访问所有机密,则创建 per-tenant 客户端机密有点毫无意义。