簡體   English   中英

中間件限制對控制器的訪問

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM