【发布时间】:2021-01-29 16:27:19
【问题描述】:
我正在尝试做的简化版本:我想编写一个授权策略,如果在数据库中设置了一个标志,它将阻止不是 GET 的请求。我注册了我的策略,处理程序代码在我的控制器上运行良好,但我不确定获取 HTTP 方法类型的最佳方法是什么。
控制器如下所示:
[Authorize(Policy = "Test")]
public class MyController : ControllerBase
{
// ...
}
我的处理程序如下所示:
protected override async Task HandleRequirementAsync(AuthorizationHandlerContext ctx, MyRequirement req)
{
// Fetch some flag from db
if (!flag)
{
ctx.Succeed(req);
return;
}
var method = GetRequestMethodFromCtx(ctx.Resource);
if (method == HttpMethods.Get)
{
ctx.Succeed(req);
}
else
{
ctx.Fail();
}
}
我注意到对于一个请求,我的处理程序会被多次调用,而 ctx.Resource 并不总是相同的类型。第一次是RouteEndpoint,之后是AuthorizationFilterContextSealed。
我应该只从RouteEndpoint 中提取 HTTP 方法并忽略第二次调用吗?另外,为什么要多次调用处理程序?
【问题讨论】:
-
为什么没有中间件来处理它?
-
@MazenAk 我将处理程序用于多个策略(通过更改
MyRequirement的成员)并将它们应用于多个控制器。起初我尝试为此编写一个中间件,但它对我的口味来说太硬了。
标签: c# asp.net-core asp.net-core-3.1 .net-core-3.1