中间件限制对控制器的访问

时间:2019-03-26 13:06:33

标签: c# asp.net-core .net-core

我已经实现了一种中间件,可以在每条路径上执行。基于身份中没有要求,我想限制路由访问。以下是我现在可以实现的功能

app.Map(new PathString(Configuration["APIRoutes"]), HandleCustomAuthentication);

//功能

private void HandleCustomAuthentication(IApplicationBuilder app)
{
    app.Run(async (context) =>
    {
        var route = context.GetRouteData();
        var token = context.Request.Headers["Authorization"].ToString().Split(" ")[1];
        if (context.Request.Headers.ContainsKey("xyz") && context.Request.Headers["xyz"] !="0" )
        {
            // No idea how to make sure if this condition is met run the particular route.
        }
    });
}

有人可以指导如何做吗?

P.S:我正在使用点网核心2.0

1 个答案:

答案 0 :(得分:0)

TL; DR :您无法执行此操作(除非您手动解析路由)。但是无论如何,这是错误的方法。

在这种情况下,您应该使用policy based authentication

长答案

您目前无法执行此操作。

在中间件内部,尚未确定。它们是在路由中间件中确定的(.UseMvc只是路由中间件)。

ASP.NET Core 2.2引入了一个新的Endpoint Routing(以前称为调度程序),它将作为新的基础并允许早期的中间件访问路由数据。

但是在ASP.NET Core 2.2中,端点路由仅在UseMvc中间件的内部使用,并且对于所有其他中间件没有公共可访问的API。这是针对ASP.NET Core 3.0宣布的。

做您要寻找的东西的正确方法是实施Policy-based Authorization。另请参见blowdart的声明here)。

基本上,您将创建基于声明的策略,并向您的操作或控制器添加[Authorize(Policy = "EmployeeOnly")]属性。

services.AddAuthorization(options =>
{
    options.AddPolicy("EmployeeOnly", policy => policy.RequireClaim("EmployeeNumber"));
});

在控制器上

[Authorize(Policy = "EmployeeOnly")]
public class MyController : ControllerBase
{
    ...
}

[Authorize(Policy = "EmployeeOnly")]
public Task<IActionResult> GetEmployeeProfile(Guid employeeId)
{
    ....
}