簡體   English   中英

是否有一個屬性我可以使用 in.net core 6 來限制我的 controller 只允許來自特定路徑的調用?

[英]Is there an attribute I can use in net core 6 to restrict my controller to only allow calls which come from a certain paths?

例如我有一個 class:

public class AccountsController : Controller
{

[HttpPost, Route("LogIn")]
public LogIn([FromBody] request)
{
 //log in
}

[HttpPost, Route("LogOut")]
public LogOut([FromBody] request)
{
 //log out
}
}

當這些 controller 端點不是直接來自基本域時,我只希望從我的站點訪問這些端點。 示例: www.mysite.com/login不應該工作,但www.mysite.com/uk/login應該工作。 注意:/uk/ 可以是任何東西

我可以在 class 上使用任何屬性或啟動時的約束來實現此目的嗎? 我搜索了路由模板,但似乎沒有任何效果。

我試圖像這樣在啟動時添加約束

endpoint.MapControllerRoute(
                    name: "Accounts",
                    constraints: new { accountsConstraint = new AccountsConstraint() },
                    pattern: "",
                    defaults: new { controller = "Accounts" });

在帳戶約束中,我正在檢查當前站點是否是基本域,但它只是繞過了這個

當這些 controller 端點不是直接來自基本域時,我只希望從我的站點訪問這些端點。 示例: www.mysite.com/login不應該工作,但www.mysite.com/uk/login應該工作。 注意:/uk/ 可以是任何東西

那么,您可以編寫自己的自定義middleware來檢查request context是否來自www.mysite.com/login 它將檢查主域是否包含路徑/login 意味着/login之后的任何主域都會導致拒絕。 是你可以實施的方式:

中間件:

public class RestrictLoginFromMainDomainMiddleware
    {
        private readonly RequestDelegate _next;

        public RestrictLoginFromMainDomainMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task InvokeAsync(HttpContext httpContext)
        {
           
            var pathToRestrict = "/login";

            var host = httpContext.Request.Host.Host;

            var path = httpContext.Request.Path.Value?.ToLower();
         
            var completePath = host + path;

            if (completePath.Contains(pathToRestrict.ToLower()))
            {
                httpContext.Response.StatusCode = StatusCodes.Status401Unauthorized;
                await httpContext.Response.WriteAsync("Unauthorized!");
            }
           
            await _next(httpContext);
        }
    }

在 Program.cs 上注冊中間件:

app.UseMiddleware<RestrictLoginFromMainDomainMiddleware>();

注意:在這里,您應該只定義需要限制的路徑。 將自動檢測主域。 例如,您要限制www.anymaindomain.com/login ,因此只定義"/login"

Output:

在此處輸入圖像描述

另一種方式:

public class RestrictMainDomainLoginMiddleware
    {
        private readonly RequestDelegate _next;

        public RestrictMainDomainLoginMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task InvokeAsync(HttpContext httpContext)
        {

            var pathToRestrict = "/login";

            if (httpContext.Request.Path.StartsWithSegments(pathToRestrict))
            {

                httpContext.Response.StatusCode = StatusCodes.Status401Unauthorized;
                await httpContext.Response.WriteAsync("Unauthorized!");

            }

            await _next(httpContext);
        }
    }

注意:它將適用於這種情況www.mysite.com/login 此處未考慮問題中未指定的其他上下文。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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