Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Identityserver4 用户动态同意_Identityserver4 - Fatal编程技术网

Identityserver4 用户动态同意

Identityserver4 用户动态同意,identityserver4,Identityserver4,我正在使用IdentityServer4为我们的环境构建SCA。 现在,每个用户都有一个或多个唯一的资源,我希望这些资源显示在同意屏幕上,以便用户同意在我们的环境中阅读 我正在使用IS4EF进行数据存储。 我还添加了一些端点,用于向数据库添加数据。 但我对如何继续感到困惑 账户是否应该有一个通用的范围?还是每个帐户有一个范围? 一个用户可以有多个同名但数据不同的声明吗 实现这一目标的最佳实践是什么?我不明白到目前为止您构建了什么,但我认为您正在使事情变得复杂 将资源视为1到n个api的逻辑组。其

我正在使用IdentityServer4为我们的环境构建SCA。 现在,每个用户都有一个或多个唯一的资源,我希望这些资源显示在同意屏幕上,以便用户同意在我们的环境中阅读

我正在使用IS4EF进行数据存储。 我还添加了一些端点,用于向数据库添加数据。 但我对如何继续感到困惑

账户是否应该有一个通用的范围?还是每个帐户有一个范围? 一个用户可以有多个同名但数据不同的声明吗


实现这一目标的最佳实践是什么?

我不明白到目前为止您构建了什么,但我认为您正在使事情变得复杂

将资源视为1到n个api的逻辑组。其中每个api可以实现1到n个作用域。作用域可以指具有特定功能的服务

假设您有
Api1
资源。您有范围
联系人
消息
。这意味着您的资源(可以是一组1到n个Api)具有处理联系人和消息的功能。其中作用域可以在资源中的任何位置实现。您可以创建一个实现所有作用域的api,两个实现一个作用域的api,使用多个实现作用域的各个部分的api,或者链接到外部api。这对用户没有任何影响

请注意,这取决于您是否需要
联系人。读取
联系人。写入
或仅
联系人
。因为在第一种情况下,读/写不是授权,而是服务的逻辑分离。而在第二种情况下,授权可以确定读/写访问权限

用户可以使用您的应用程序访问资源。为了授予应用程序对资源的访问权(因为客户端代表该用户请求信息),用户必须给予同意

如果用户不愿意,则不允许客户端代表用户访问资源,并且服务无法完全执行。因此,如果您不想共享您的联系人,那么用户必须以另一种方式提供信息,或者干脆不提供服务,因为没有相关要求

另一方面,用户也是一种资源,因为UserClaimes包含关于用户的信息。因此,用户资源也可以有作用域,比如openid、profile、email和address。如果用户不同意使用概要文件,则必须以另一种方式获取信息,类似于api资源的情况

但作用域之间存在差异。例如,Openid是一个必需的范围,因为它包含(至少)子声明,用于标识用户。这是一项不能撤销的最低要求。用户唯一的选择是单击
不谢谢
,这意味着用户选择不使用该应用程序

因此,您有一个api和一个客户端(例如mvc应用程序)。api可以有1到n个作用域,mvc应用程序可以请求1到n个作用域(来自api和用户资源)

您可以扩展IdentityServer以充当资源。我不是指端点,而是指实际的api。您甚至可以为此创建一个单独的api。只需配置api、添加作用域和配置客户端

假设我添加IdApi作为资源和一个作用域
帐户
。此范围适用于所有可用用户,但使用基于资源的授权,您可以确定用户(以及应用程序)的确切访问级别。您可以根据需要选择设置范围

因此,帐户不能被用户绑定,因为作用域是资源的子级。不要混淆作用域和角色。作用域与授权本身无关。作用域由客户端请求,而角色由用户绑定。是的,您可以添加来自同一类型的多个声明,例如role=admin、role=manager。这将产生一组角色。但在这种情况下,这不是你需要的

api和标识作用域都用作userclaims的过滤器。在配置文件的情况下,所有与允许的声明类型列表中的类型匹配的声明都将添加到令牌中,前提是客户机请求范围

api验证的是资源名(aud),而不是作用域名。为了检查作用域,您可以使用事件、中间件和策略


如果您让我知道这个答案是否对您有帮助,或者是否需要其他信息,那么我可以更新答案。

您好,谢谢您的回答。首先,既然你提到了,我想问你:如果我用一个控制器扩展identityserver,使它成为一个api(apiresource)。我如何使用它来保护自己?我尝试使用AddJwtBearer,但后来我破坏了oidc-login。第二个问题:为什么范围不能不受用户约束?User1获得了account1和account2。而user2得到了account3和account4。User1不授予client1访问account1的权限。正如前面所解释的,作用域定义了资源的一部分,客户端可以请求该作用域。那么它是如何与用户绑定的呢?用户无法授予客户端访问权限,已配置访问权限。用户所能做的就是同意客户端代表其访问资源。但这并不局限于user1。所以accountx似乎根本不是一个作用域。如何配置accountx?按此处所述添加Jwt承载身份验证处理程序:并确保使用方案标记控制器:
[授权(AuthenticationSchemes=JwtBearerDefaults.AuthenticationScheme)]
。您还可以将api添加为端点:我知道STS上下文中的作用域应该是什么。但在我的例子中,我需要创建一个同意页面,其中user1同意account1或/和account2。由于同意页面只显示范围,我需要account1和account2作为范围,打破范围的原始角色。