我已经实现了一种中间件,可以在每条路径上执行。基于身份中没有要求,我想限制路由访问。以下是我现在可以实现的功能
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
答案 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)
{
....
}