如何授予委托用户对托管服务身份的权限
How to grant delegated user pemissions to managed-service-identity
TL;DR
当通常的 interactive
方式(例如带有同意屏幕弹出窗口的 Web 应用程序)不可行时,如何将我的用户权限委托给 Azure Ad 中的服务主体?这是因为我无法在 Azure 门户中正确配置 MSI 以这种方式工作。
更多详情
我想授予应用程序代表用户访问图表 API 的权限。通常,这是一个 well-documented 场景,您在其中创建应用注册,通过请求所需范围的权限来获取 delegated user permissions
,然后在应用中使用这些权限。
需要 Graph 访问权限的应用是后台服务,无需用户即可自行运行 intervention/activity。对于这个用例,常用的方法是使用 application permissions
。在我的例子中,这是不可行的,因为应用程序权限需要管理员同意,并且是一种全有或全无的权限。我不可能得到这个。没错,因为它杀伤力太大了。
但另一方面,这真的很可惜。很遗憾,因为我发现了一个关于如何将 Graph API 应用程序权限直接分配给 Managed Service Identity
而不是自行注册的应用程序的 example。我的服务(作为 Azure Functions 应用)已经分配了一个 MSI。所以这将是完美的选择,b 再一次,我无法获得这些应用程序权限。
那么解决方法是什么?我们有这个 user principal
,它具有我们后台服务所需的所有必需权限。我想做的是将这个用户的权限委托给Function App/MSI。为了做到这一点,我使用 this SPA-template by the MSAL team 来获得一些提示权限弹出窗口的东西。
然而,这失败了,因为 implicit oauth flow
没有启用。要解决此问题,您通常需要更新门户中的应用程序清单。但是,由于这是一个 MANAGED 服务身份,而不是自行注册的身份,因此 MSI 未在应用程序注册下的门户中列出。所以我无法将此 属性 设置为 true。
通过 Azure CLI 执行同样的操作也失败了,因为显然 MSI 未被识别为应用程序。
az ad app update --oauth2-allow-implicit-flow true --id <appId_of_MSI>
这会产生以下错误:
ResourceNotFoundError: Resource '<appId_of_MSI>' does not exist or one of its queried reference-property objects are not present.
执行此操作时显示正常
az ad sp show --id <appId_of_MSI>
总而言之:我无法完成委派该用户权限的过程interactively
。还有别的办法吗?也许通过 CLI?
后备解决方案是创建一个单独的 unmanaged/self-registered 应用标识。但我真的想避免这种情况,因为那样我就需要再次管理和轮换客户端(应用程序)凭据,这是 MSI 为我处理的。
为什么 o 为什么我不能只分配精细范围的应用程序权限
非常感谢对此的任何帮助。干杯。
根据我的经验,托管身份不支持您建议的方案。
他们没有应用程序注册,因此无法以交互方式对用户进行身份验证。
我会选择你的后备解决方案;正常的应用程序注册并使用它代表用户访问 Graph API。
至少这是我们在项目中所做的。
应用程序权限 -> 托管身份(如果可能)。委派权限 -> 正常应用程序注册 + secret/certificate 在 Key Vault 中,使用托管身份检索。
TL;DR
当通常的 interactive
方式(例如带有同意屏幕弹出窗口的 Web 应用程序)不可行时,如何将我的用户权限委托给 Azure Ad 中的服务主体?这是因为我无法在 Azure 门户中正确配置 MSI 以这种方式工作。
更多详情
我想授予应用程序代表用户访问图表 API 的权限。通常,这是一个 well-documented 场景,您在其中创建应用注册,通过请求所需范围的权限来获取 delegated user permissions
,然后在应用中使用这些权限。
需要 Graph 访问权限的应用是后台服务,无需用户即可自行运行 intervention/activity。对于这个用例,常用的方法是使用 application permissions
。在我的例子中,这是不可行的,因为应用程序权限需要管理员同意,并且是一种全有或全无的权限。我不可能得到这个。没错,因为它杀伤力太大了。
但另一方面,这真的很可惜。很遗憾,因为我发现了一个关于如何将 Graph API 应用程序权限直接分配给 Managed Service Identity
而不是自行注册的应用程序的 example。我的服务(作为 Azure Functions 应用)已经分配了一个 MSI。所以这将是完美的选择,b 再一次,我无法获得这些应用程序权限。
那么解决方法是什么?我们有这个 user principal
,它具有我们后台服务所需的所有必需权限。我想做的是将这个用户的权限委托给Function App/MSI。为了做到这一点,我使用 this SPA-template by the MSAL team 来获得一些提示权限弹出窗口的东西。
然而,这失败了,因为 implicit oauth flow
没有启用。要解决此问题,您通常需要更新门户中的应用程序清单。但是,由于这是一个 MANAGED 服务身份,而不是自行注册的身份,因此 MSI 未在应用程序注册下的门户中列出。所以我无法将此 属性 设置为 true。
通过 Azure CLI 执行同样的操作也失败了,因为显然 MSI 未被识别为应用程序。
az ad app update --oauth2-allow-implicit-flow true --id <appId_of_MSI>
这会产生以下错误:
ResourceNotFoundError: Resource '<appId_of_MSI>' does not exist or one of its queried reference-property objects are not present.
执行此操作时显示正常
az ad sp show --id <appId_of_MSI>
总而言之:我无法完成委派该用户权限的过程interactively
。还有别的办法吗?也许通过 CLI?
后备解决方案是创建一个单独的 unmanaged/self-registered 应用标识。但我真的想避免这种情况,因为那样我就需要再次管理和轮换客户端(应用程序)凭据,这是 MSI 为我处理的。
为什么 o 为什么我不能只分配精细范围的应用程序权限
非常感谢对此的任何帮助。干杯。
根据我的经验,托管身份不支持您建议的方案。 他们没有应用程序注册,因此无法以交互方式对用户进行身份验证。
我会选择你的后备解决方案;正常的应用程序注册并使用它代表用户访问 Graph API。 至少这是我们在项目中所做的。 应用程序权限 -> 托管身份(如果可能)。委派权限 -> 正常应用程序注册 + secret/certificate 在 Key Vault 中,使用托管身份检索。