azure - 通过 AzureAD 应用程序注册进行授权的最佳方式 : roles or group claims when only one AD group is required for access

标签 azure azure-active-directory authorization msal-angular

我有一个用于我的前端 SPA 的 AzureAD 应用程序注册。我将 Angular 与 Microsoft 的 @azure/msal-angular v2 身份验证库结合使用。我的应用程序注册具有所有必要的重定向 URI,并使用授权代码流和 PKCE 配置正确的 OAuth2 OpenID Connect。我的应用程序使用仅具有 User.Read 范围的 Microsoft Graph API。我可以很好地验证。但是,如果我的应用程序仅适用于由 AD 组定义并分配到 Azure 中的“用户和组”部分的一组人员,那么验证登录用户是否已获得授权的最佳方法是什么?我尝试过为访问 token 启用可选的组声明,但由于某种原因这些声明没有通过。然后我尝试添加角色 - 我有一个“管理员”角色,这是我唯一需要的角色。这个角色被分配给我之前提到的AD组。角色声明确实回来了,我可以使用它,但是当我应该能够验证登录的用户是否在我的 AD 组中时,这似乎很愚蠢。角色方法确实有一个很好的功能,即为用户分配不同的角色来验证开发目的的授权,但不确定是否有更好的方法。

在某些时候,我需要插入一个 API。最好从中获取声明并使用它进行验证吗?

我是否缺少某个范围或设置?我实现这一切都是错误的吗?感谢所有回复的人。

最佳答案

此时,您已拥有一个调用 MS 第一方 API(即 MS Graph)的 SPA。

由于您正在获取 MS Graph 的 accessToken,因此该 accessToken 无法更改 - 它意味着由 MS Graph 本身进行解码和验证,因此您将无法对该 token 添加任何额外的声明,因为您这样做了不控制资源。

此外,您的客户端应将 accessToken 视为不透明字符串,您永远不应该依赖前端的 accessToken 的任何声明。

您可以在这里阅读更多相关信息: https://learn.microsoft.com/en-us/azure/active-directory/develop/access-tokens

如果您想在前端进行某种授权,例如决定您的用户可以访问哪些路由,则需要依赖 idToken。对于 idToken,您可以启用群组声明并获取用户所属群组的列表。

如果,如上所述,稍后您需要创建一个自定义 API 并从您的 SPA 调用它,那么,在这种情况下,您确实可以将组声明添加到 accessToken,因为它将是一个资源,您控制,然后根据该声明授权访问您的 API 的请求

MS 有一个示例,准确展示了如何使用安全组进行访问控制,并使用 Angular 前端和 .NET Core Web API。在这里检查一下: https://github.com/Azure-Samples/ms-identity-javascript-angular-tutorial/blob/main/5-AccessControl/2-call-api-groups/README.md

关于azure - 通过 AzureAD 应用程序注册进行授权的最佳方式 : roles or group claims when only one AD group is required for access,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73176403/

相关文章:

Java - 如何等待 uploadFileToBlockBlob 完成?

azure - 无法在 azure AKS 中为节点池创建节点标签

azure - 是否可以在客户端凭据流程中添加自定义声明?

azure - 有条件地将 Blob 数据复制到 Azure 数据工厂中的 Sql 数据库

c# - 具有枚举角色的 ASP.NET Core 中的自定义授权

node.js - 如何使用nodejs设置Authorization Bearer header

azure - 将 Web 应用程序发布到 Azure

azure - 在 AAD 应用程序注册中显示与托管服务身份服务主体关联的应用程序

java - CAS + Spring 安全

r - 使用 R 访问 Azure Databricks 中的大数据的最佳实践