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?
要回答您的问题,您可以在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:
client
account
范围在控制器顶部。client
account.read
Index方法,account.write
Create和Update方法,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"));
最后一部分不会回答您的原始问题,但可以回答评论中提出的问题。