asp.net-core-webapi - 每个操作方法的策略相同但所需参数不同
问题描述
在一个.Net core Webapi 2.1
项目中,我有很多动作方法。
所有操作方法都应针对相同的策略(名为FooPolicy
)进行授权,但需要使用不同的参数。
基于 Microsoft 的文档:Policy-based-Authorization
一种方法是根据不同的输入参数声明大量策略:
services.AddAuthorization(options =>
{
options.AddPolicy("FooPolicy1", policy =>policy.Requirements.Add(new FooRequirement(1)));
options.AddPolicy("FooPolicy2", policy =>policy.Requirements.Add(new FooRequirement(2)));
options.AddPolicy("FooPolicy3", policy =>policy.Requirements.Add(new FooRequirement(3)));
//... May be 30 more same policies here ...
});
正如我之前提到的,只有不同的部分在new FooRequirement(diffArgs)
. 此解决方案的另一个挑战是将每个添加FooPolicy
到其相应的操作方法上,您可能会错过几个主题:
[Authorize(Policy = "FooPolicy1")]
public IActionResult ActionMethodFoo1(...) {...}
[Authorize(Policy = "FooPolicy2")]
public IActionResult ActionMethodFoo2(...) {...}
[Authorize(Policy = "FooPolicy3")]
public IActionResult ActionMethodFoo3(...) {...}
...List still goes on...
是否有任何解决方案,例如:声明一次策略,但将其与不同的实例FooRequirement
(类型为IAuthorizationHandler
)一起使用?像这样:
services.AddAuthorization(options =>
{
options.AddPolicy("FooPolicy", policy =>policy.Requirements.Add(?));
});
并在操作方法上:
[Authorize(Policy = "FooPolicy", required = new FooRequirement(1))]
public IActionResult ActionMethodFoo1(...) {...}
[Authorize(Policy = "FooPolicy", required = new FooRequirement(2))]
public IActionResult ActionMethodFoo2(...) {...}
[Authorize(Policy = "FooPolicy", required = new FooRequirement(3))]
public IActionResult ActionMethodFoo3(...) {...}
主要思想是一次申报政策。最近的两个代码块是psudo-code,有没有人知道具有类似概念的实际解决方案?
解决方案
你可以实现你自己的IAuthorizationFilter
风俗
IAuthorizationFilter
public class CustomAuthorize : IAuthorizationFilter { private readonly int _input; public CustomAuthorize(int input) { _input = input; } public void OnAuthorization(AuthorizationFilterContext context) { //custom validation rule if (_input == 1) { context.Result = new ForbidResult(); } } }
风俗
CustomAuthorizeAttribute
public class CustomAuthorizeAttribute : TypeFilterAttribute { public CustomAuthorizeAttribute(int input) : base(typeof(CustomAuthorize)) { Arguments = new object[] { input }; } }
利用
[CustomAuthorizeAttribute(1)] public IActionResult About()
推荐阅读
- java - 使用java同时进行多个数据库连接和查询时是否应该使用同步?
- swift - 导航项的titleView向左移动?
- python - 现在反馈连接是否有效
- javascript - 对象数组转换为按索引排序的对象(Javascript)
- karate - 如何使用功能文件在空手道中实现 for 循环
- java - ANDROID中Intent的GetStringExtras默认值是多少?
- vue.js - 在 service-worker 中使用 vue store
- c - 在c中初始化一个扫雷艇
- html - 在 html 中嵌入 pdf:gview 和简单 iframe 之间的区别
- javascript - Three.js/WebGL 可以渲染用 Adobe Illustrator 制作的复杂 SVG 吗?