[英]Middleware restricting access to controller
我已經實現了一個可以在每條路線上執行的中間件。 基於身份中沒有索賠,我想限制路線訪問。 以下是我現在能夠實現的內容
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.
}
});
}
有人可以指導怎么做嗎?
PS:我正在使用dot net core 2.0
TL; DR :你不能這樣做(除了你手動解析路線)。 但無論如何它是錯誤的方法。
在這種情況下,您應該使用基於策略的身份驗證 。
你不能這樣做(現在)。
在中間件內部,尚未確定。 它們是在路由中間件中確定的( .UseMvc
是路由中間件)。
ASP.NET Core 2.2引入了一個新的端點路由 (以前稱為調度程序),它將充當新的基礎並允許早期中間件訪問路由數據。
但是在ASP.NET Core 2.2中,端點路由僅在UseMvc
中間件的UseMvc
,並且沒有用於所有其他中間件的公共可訪問API。 這是為ASP.NET Core 3.0宣布的。
正確執行所需操作的方法是實施基於策略的授權 。 另見blowdart的說法在這里 )。
基本上,您創建基於聲明的策略,並為您的操作或控制器添加[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)
{
....
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.