要回答您的问题,您可以在 RequireClaim 语句中添加多个参数。作为documented:
RequireClaim(String, String[])
claimType
字符串
要求的声明类型。
allowedValues
IEnumerable
声明必须处理一个或多个的值以进行评估
成功。
在你的情况下是这样的:
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"));
但这对于示波器来说有点奇怪。
拥有范围意味着客户端有权访问资源,而不管哪个用户使用客户端。
范围标记资源中执行特定任务的部分,换句话说,具有特定功能。
假设一个 CRUD AccountController:
您可以授权 客户端 访问整个控制器,在这种情况下使用控制器顶部的 account 范围。
您可以根据方法授权 客户端,例如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"));
想想看,基于上面提到的客户应用,还有第三种选择:
- 您可以根据方法授权 客户端,例如
AccountRead Index 方法和 Account 用于其他方法。其中AccountRead 必须包含帐户范围。
政策将如下所示:
// policy to allow client access to write and delete functionality
options.AddPolicy("Account", policy =>
policy.RequireClaim(JwtClaimTypes.Scope, "account"));
// policy to allow client access to read functionality only
options.AddPolicy("AccountRead", policy =>
policy.RequireClaim(JwtClaimTypes.Scope, "account", "account.read"));
管理应用只需请求account 范围,而客户应用可以请求account.read 范围。
请注意,最后一部分没有回答您原来的问题,但可能会回答 cmets 中提出的问题。