通过使用 Azure AD 的代表流来限制用户范围
Restricting user scopes by using an on-behalf-of flow with Azure AD
我有一个 SPA React 应用程序,它使用 MSAL 登录用户并获取令牌以查询 MS Graph。目前,创建用户时he/she可以有两种不同的角色,即:
- 管理员
- 观看者
照原样,每个用户都可以从 AAD 获得相同的范围 - 无论他们是一个角色还是另一个角色。
这带来了一个问题 - 因为任何用户在调用 MS Graph 时都可能具有相同的权限,即他们可以自己获取令牌并请求具有完整范围的图形。
查看者角色应该只能拥有 [User.Read]
范围,而管理员应该能够更改 Azure AD 的各个方面。
此外,管理员应该能够在 MS 图表中执行委托权限不支持的操作,即 creating new users。
以下内容让我觉得我可能需要重新考虑用户从 MS Graph 请求资源的方式 - 这让我认为 on-behalf-of flow 将是一个有趣的选择。
如我所想,流程将按如下方式工作(从用户登录并请求在我的 SPA 中创建新用户开始)
- 用户在我的 SPA 中使用 MSAL 登录
- 用户获得最低权限范围,即
[user.Read]
- 用户创建一个新用户
- SPA 向我的 Web API 发送请求,用户的令牌作为承载
- Web API 使用 AAD
验证用户令牌
- Web API 验证用户具有“管理员”角色
- Web API 获得一个具有
["User.ReadWrite.All", "Directory.ReadWrite.All"]
个范围的令牌
- Web API 代表用户使用获取的应用程序范围调用图形
- Web API returns 数据到我的SPA
由于我对这个世界还很陌生 - 我想知道我的思维方式是否有道理。特别是,我很好奇是否真的可以代表仅具有 [user.Read]
范围的用户从我的 Web API.
请求提升的权限 ["User.ReadWrite.All", "Directory.ReadWrite.All"]
此外,我很乐意就解决上述问题的替代方法提出任何建议。
范围(委托权限)适用于应用程序,而不是用户。
从根本上说,无论用户在他们的令牌中获得什么范围,他们都不能做任何他们还不能做的事情。
Microsoft Graph API 检查范围以检查应用程序的权限,然后检查用户的权限以查看他们是否也能够执行该操作。
因此,用户永远无法通过范围提升他们的权限。
如果您有任何自己的 API,您也应该以类似的方式处理授权。
如果使用范围,还要检查用户的权限。
对于应用程序权限(具有成员类型应用程序的应用程序角色),没有用户,因此您的 API 只会检查这些权限。
这就是为什么如果您的后端使用应用程序权限而不是代表流量,您需要格外小心授权;由于他们不包括用户,因此可以允许他们通过您的应用程序提升他们的权限。
我有一个 SPA React 应用程序,它使用 MSAL 登录用户并获取令牌以查询 MS Graph。目前,创建用户时he/she可以有两种不同的角色,即:
- 管理员
- 观看者
照原样,每个用户都可以从 AAD 获得相同的范围 - 无论他们是一个角色还是另一个角色。
这带来了一个问题 - 因为任何用户在调用 MS Graph 时都可能具有相同的权限,即他们可以自己获取令牌并请求具有完整范围的图形。
查看者角色应该只能拥有 [User.Read]
范围,而管理员应该能够更改 Azure AD 的各个方面。
此外,管理员应该能够在 MS 图表中执行委托权限不支持的操作,即 creating new users。
以下内容让我觉得我可能需要重新考虑用户从 MS Graph 请求资源的方式 - 这让我认为 on-behalf-of flow 将是一个有趣的选择。
如我所想,流程将按如下方式工作(从用户登录并请求在我的 SPA 中创建新用户开始)
- 用户在我的 SPA 中使用 MSAL 登录
- 用户获得最低权限范围,即
[user.Read]
- 用户创建一个新用户
- SPA 向我的 Web API 发送请求,用户的令牌作为承载
- Web API 使用 AAD 验证用户令牌
- Web API 验证用户具有“管理员”角色
- Web API 获得一个具有
["User.ReadWrite.All", "Directory.ReadWrite.All"]
个范围的令牌 - Web API 代表用户使用获取的应用程序范围调用图形
- Web API returns 数据到我的SPA
由于我对这个世界还很陌生 - 我想知道我的思维方式是否有道理。特别是,我很好奇是否真的可以代表仅具有 [user.Read]
范围的用户从我的 Web API.
["User.ReadWrite.All", "Directory.ReadWrite.All"]
此外,我很乐意就解决上述问题的替代方法提出任何建议。
范围(委托权限)适用于应用程序,而不是用户。 从根本上说,无论用户在他们的令牌中获得什么范围,他们都不能做任何他们还不能做的事情。 Microsoft Graph API 检查范围以检查应用程序的权限,然后检查用户的权限以查看他们是否也能够执行该操作。 因此,用户永远无法通过范围提升他们的权限。
如果您有任何自己的 API,您也应该以类似的方式处理授权。 如果使用范围,还要检查用户的权限。 对于应用程序权限(具有成员类型应用程序的应用程序角色),没有用户,因此您的 API 只会检查这些权限。 这就是为什么如果您的后端使用应用程序权限而不是代表流量,您需要格外小心授权;由于他们不包括用户,因此可以允许他们通过您的应用程序提升他们的权限。