我有一个用于我的前端 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/