【问题标题】:What is the proper way of getting the HTTP request method in an AuthorizationHandler<T>?在 AuthorizationHandler<T> 中获取 HTTP 请求方法的正确方法是什么?
【发布时间】: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


【解决方案1】:

为了访问HttpContext 对象,您可以使用IHttpContextAccessor 服务。

您可以简单地将其作为您的授权处理程序类的依赖项,ASP.NET 核心依赖项注入将为您提供服务。

要使用依赖注入注册它,您需要在 Startup 类的 ConfigureServices 方法中调用 services.AddHttpContextAccessor()

您可以从HttpContext 访问Request,然后访问Method 属性(请参阅here)。

详情请参阅official documentation

我不完全了解您的要求,但为了防止使用特定 HTTP 动词调用操作方法,有一种更简单的方法。您只需要使用内置的路由属性,您可以找到更多信息here

【讨论】:

    猜你喜欢
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多