首页 > 解决方案 > 身份服务器 - 根据应用程序中的选择动态更新声明

问题描述

我有一个使用 Identity Server 4 并打开 id connect 进行身份验证和授权的应用程序。我现在正在与系统架构师讨论在处理用户权限时想要做一些更改。在此应用程序中,用户可以是单个或多个区域的一部分,并且在该区域内,用户可以是单个或多个客户的一部分。这些用户具有区域角色和客户角色。在每个区域内,一个用户可以(在最坏的情况下,但非常可能的情况下)成为 150 多个客户的一部分,每个客户具有不同的角色,这可能导致总共大约 2500 个权限。

当用户浏览应用程序时,该人选择用户当前正在浏览的不同区域和客户。这意味着,用户在资源中拥有不同的权限,具体取决于它当前正在处理的区域/客户。我的系统架构师建议将这些权限存储在发送到资源的访问令牌中,以便资源检查是否允许用户对指定区域/客户执行此操作,并且这些权限声明应在何时更新用户更改区域和/或客户。我担心这些权限似乎有点过于动态,无法在访问令牌内处理,因为这些权限可能会在应用程序内的用户会话期间多次更改,

首先,是否有可能告诉身份服务器“用户 A 刚刚选择了这个地区/客户,请更新令牌中的所有声明以匹配这个地区/客户”,如果是,我将如何传递信息当前选择的区域和客户的配置文件服务/用户信息端点(无需将每个区域/客户建模为自定义声明)?

其次,我担心这太动态而无法存储在令牌中,因为这将在用户会话中多次更改。由于用户登录应用程序本身,而不是每个区域和客户,我的建议是我们将此逻辑放在 api/resource 中,以便当某个请求到达 API 时,我们检查我们的权限数据库或缓存还要查看用户是否为区域和客户执行的操作是该操作。我的理解是 OpenID Connect 和 OAuth 不应该以他建议的方式真正使用,但我可能错了?

我已经通过最小特权阅读了这篇文章,它似乎解决了我所说的相同问题,但我的系统架构师似乎并不那么确信..

标签: oauthpermissionsidentityserver4

解决方案


PolicyServer是上述文章的后续。

我可以重复那里写的内容,但简而言之:授权很困难,权限不应该是访问令牌的一部分。

与身份验证不同,授权是特定于上下文的,并且在不同级别上运行。这使得访问令牌不是获得权限的最佳位置。您还遇到更新声明等问题。

基本上 IdentityServer 的主要目的是处理用户的身份验证和全局授权(如哪个客户端可以访问哪个资源)。

对于授权,他们创建了 PolicyServer,其中授权已成为向身份添加权限(声明)的单独机制。在 OSS 版本中,这是通过本地中间件完成的,但在付费版本中,这是一个单独的服务器。

授权上下文基于客户端、资源和用户。当您将其用作“键”时,您可以为此上下文添加声明。使其在微服务架构中非常有用。

还要记住,某些授权可以是基于资源的。例如,在 WebsiteAdmin 表中存在用户可能意味着该用户是网站管理员。或者仅在用户创建文档时才为用户提供文档。


推荐阅读