如何添加具有多个作用域的授权策略?

问题描述 投票:0回答:1
options.AddPolicy("Account", policy => policy.RequireClaim(JwtClaimTypes.Scope, "account"));
options.AddPolicy("AccountWrite", policy => policy.RequireClaim(JwtClaimTypes.Scope, "account.write"));
options.AddPolicy("AccountRead", policy => policy.RequireClaim(JwtClaimTypes.Scope, "account.read"));

您如何在策略范围内添加OR?

  • [范围为“帐户”(读取,写入和删除)时的“帐户”策略]
  • “范围为“ account”或“ account.write”(读和写)时的“ AccountWrite”策略]
  • 范围为“ account.read”(只读)时的““ AccountRead”策略]
asp.net asp.net-core asp.net-web-api authorization identityserver4
1个回答
0
投票

要回答您的问题,您可以在RequireClaim语句中添加多个参数。作为documented

RequireClaim(String,String [])

claimType字符串

所需的索赔类型。

allowedValuesIEnumerable

索赔必须处理的值[[一个或多个以进行评估成功。

您的情况是:

options.AddPolicy("Account", policy => policy.RequireClaim(JwtClaimTypes.Scope, "account", "account.read", "account.write", "account.delete")); options.AddPolicy("AccountWrite", policy => policy.RequireClaim(JwtClaimTypes.Scope, "account", "account.write")); options.AddPolicy("AccountRead", policy => policy.RequireClaim(JwtClaimTypes.Scope, "account", "account.read"));


但是对于合并范围来说有点奇怪。

具有作用域意味着

client

被授权访问资源,无论哪个用户使用该客户端。作用域标记了执行特定任务的资源的一部分,换句话说,具有某些功能。

假设一个CRUD AccountController:

  1. 您可以授权

    client

来访问整个控制器,在这种情况下,请使用account范围在控制器顶部。
  • 您可以根据每个方法授权

    client

  • ,例如account.read Index方法,account.write CreateUpdate方法,account.delete Delete方法。由于功能不同,合并范围不太可能。两者都可以,因为需要授权使用资源的是

    用户

    。客户端将用户带到资源并代表用户执行请求。但是将两者结合起来是没有意义的。什么是适合您的设计?

    假设您有一个管理应用程序,允许用户管理该帐户。客户拥有自己的应用程序,并希望使用该应用程序访问资源,但您不想允许对该应用程序进行全面管理。

    在那种情况下,应该允许来自客户的

    client

    应用仅请求account.read范围。因为,如果允许用户管理帐户,那么您要确保仅使用您的应用程序才可以这样做。因此您可以'规范化'策略。

    对于1。

    options.AddPolicy("Account", policy => policy.RequireClaim(JwtClaimTypes.Scope, "account"));

    和2。

    options.AddPolicy("AccountDelete", policy => policy.RequireClaim(JwtClaimTypes.Scope, "account.delete")); options.AddPolicy("AccountWrite", policy => policy.RequireClaim(JwtClaimTypes.Scope, "account.write")); options.AddPolicy("AccountRead", policy => policy.RequireClaim(JwtClaimTypes.Scope, "account.read"));

    最后一部分不会回答您的原始问题,但可以回答评论中提出的问题。
    © www.soinside.com 2019 - 2024. All rights reserved.