Azure AD:如何将安全组和应用程序角色都放入访问令牌

Posted

技术标签:

【中文标题】Azure AD:如何将安全组和应用程序角色都放入访问令牌【英文标题】:Azure AD: How to get both security groups and application roles into access token 【发布时间】:2021-06-23 07:19:46 【问题描述】:

我面临一种情况,我的 .NET Core 应用程序 (Azure Web API) 将以两种方式访问​​:

client_credentials 流 委派权限(用户)流程

我正在使用 Microsoft Identity Web 在中间件级别通过 AD 授权和验证请求。然后我想在我的控制器方法中进行额外的授权以检查以下内容:

    如果是应用程序调用(客户端凭据),请检查提供的 access_token 是否包含与 应用注册中定义的应用程序角色匹配的特定角色声明 -> 应用角色。 如果是登录用户调用,请检查提供的 access_token 是否包含在 Azure AD 中分配给该用户的特定 AD 组(安全组)。

流程 #1 有效,但如果我通过单击 令牌配置 -> 添加组声明 -> 安全组 -> 将组作为访问令牌中的角色声明发出组 来启用流程 #2,则应用程序角色在访问令牌内的客户端凭据流中不再可用(如下面的屏幕截图所示),可能是因为它用安全组(应用程序不存在)覆盖了角色声明。

这样做的正确方法是什么,或者以不同的方式达到相同的情况? 要求是区分应用程序 A 可以调用的控制器方法访问,例如一个只读端点 1,但不能调用写端点 2,而应用程序 B 能够调用写端点 2。对于基于 AD 组的用户也应该进行相同的区分。

【问题讨论】:

【参考方案1】:

您可以在您的令牌中include a groups claim。您只需要修改应用清单中的“groupMembershipClaims”字段:

"groupMembershipClaims": "SecurityGroup"

然后令牌将包含使用所属组的 ID,如下所示:


  "groups": ["group_id"]

此方法不会覆盖roles 声明。因此,对于委派权限(用户)流程,您现在需要检查 groups 声明。

【讨论】:

以这种方式配置它,我不再看到角色声明中的应用程序角色。它将按照您的建议在组中显示安全组,但不显示应用程序角色。有什么想法吗? @PetteriPertola 根据我的测试,委托的用户访问令牌包括groups 声明,应用程序访问令牌包括roles 声明中的应用程序角色。确保检查应用程序访问令牌中的应用程序角色,而不是委托的用户访问令牌。如果问题仍然存在,请分享您如何定义应用角色以及如何获取应用访问令牌。 @PetteriPertola 你检查我的评论了吗?有更新吗? 对不起 - 复活节假期。我能够找到一种替代方法,即将应用程序作为服务主体分配到 AD 中的安全组中,在这种情况下,我在角色声明中获得了 AD 组对象 ID。这样,无论您是用户还是应用程序,我们都只需要一种授权方式,因此该解决方案最终对我们有用。 @PetteriPertola 好主意!您可以发布您的解决方案作为帮助他人的答案。

以上是关于Azure AD:如何将安全组和应用程序角色都放入访问令牌的主要内容,如果未能解决你的问题,请参考以下文章

Azure AD 身份验证和为应用程序用户分配角色

从 Azure AD 发出 JWT 令牌中的角色

Azure AD B2C 单页应用角色

是否可以为 Azure AD 中的用户或组分配多个角色?

无法从 azure AD 应用清单分配角色

Azure AD 应用程序角色