我正在使用IdentityServer4为我们的环境构建SCA。 现在,每个用户都有一个或多个我希望在同意屏幕上显示的独特资源,以便用户同意可以在我们的环境中阅读。
我正在使用IS4 EF进行数据存储。 并且我添加了一些端点,用于将数据添加到数据库。 但是我对如何继续感到困惑。
帐户应该有通用范围吗?或每个帐户一个范围? 用户可以有多个具有相同名称但具有不同数据的声明吗?
实现此目标的最佳做法是什么?
答案 0 :(得分:1)
到目前为止,我还不了解您所构建的内容,但我认为您正在使事情变得复杂。
将资源视为1到n个api的逻辑组。每个api可以实现1到n个范围。范围可以指具有某些功能的服务。
假设您拥有Api1
资源。并且您有范围Contacts
和Messages
。这意味着您的资源(可以是1到n个Api的组)具有处理联系人和消息的功能。范围可以在资源内的任何地方实现的地方。您可以创建一个实现所有作用域的api,两个实现每个作用域的api,使用多个实现作用域的各个部分的api或链接到外部api。这对用户没有影响。
请注意,这取决于您是否需要contacts.read
和contacts.write
还是仅需要contacts
。因为在第一种情况下,读/写不是授权,而是服务的逻辑分离。在第二种情况下,授权可以确定读写访问权限。
用户可以使用您的应用程序访问资源。为了授予应用程序对资源的访问权限(因为客户端正在代表该用户请求信息),用户必须征得其同意。
如果用户不想这样做,则不允许客户端代表用户访问资源,并且服务无法完全执行。因此,如果您不想共享您的联系人,则用户必须以其他方式提供信息,或者由于无法满足需求而根本不提供服务。
另一方面,用户也是资源,因为UserClaims包含有关用户的信息。因此,用户资源也可以具有范围,例如openid,个人资料,电子邮件,地址。如果用户不同意使用配置文件,则必须以另一种方式获取信息,类似于api资源的情况。
但是范围之间存在差异。例如,Openid是必需的范围,因为它包含(至少)标识用户所需的子声明。这是不可撤销的最低要求。用户唯一的选择是单击No Thanks
,这意味着用户选择不使用该应用程序。
因此,您有一个api和一个客户端(例如mvc应用程序)。 api可以具有1到n个范围,而mvc应用程序可以请求1到n个范围(从api和用户资源)。
您还可以扩展IdentityServer使其充当资源。而且,我的意思不是端点,而是实际的api。您甚至可以为此创建一个单独的api。只需配置api,添加作用域并配置客户端。
假设我将IdApi添加为资源和范围Account
。该范围适用于所有可用用户,但是使用基于资源的授权,您可以确定用户(以及应用程序)具有的确切访问级别。您可以选择根据需要设置范围。
因此,帐户不能被用户绑定,因为范围是资源的子级。不要将作用域与角色混淆。范围与授权本身无关。范围由客户端请求,而角色由用户绑定。是的,您可以添加具有相同类型的多个声明,例如角色=管理员,角色=经理。这将导致角色的集合。但这不是您需要的。
api和Identity范围都用作用户声明的过滤器。如果是个人档案,只要客户请求范围,所有与允许的声明类型列表中的类型匹配的声明都将添加到令牌中。
api会验证资源名称(aud),而不是范围名称。为了检查范围,您可以使用事件,中间件和策略。
如果您让我知道此答案是否对您有帮助,或者是否需要其他信息,那么我可以更新答案。