簡體   English   中英

在 Asp.net 內核中根據每個請求決定是否使用授權

[英]Deciding to use Authorization or not on a per-request basis in Asp.net Core

我正在開發一個 ASP.net 核心 MVC 2.2 應用程序,目前我在我的 controller 操作上使用經典的[Authorize][AllowAnonymous]屬性來決定是否可以匿名訪問某個操作或需要授權。

但是,我有一個要求,即僅當 http 請求中缺少某個 header 時,某些操作才需要授權。 通常我會通過簡單地實現這一點:

[HttpGet]
[AllowAnonymous]
public IActionResult SomeAction()
{
    if (!Request.Headers.ContainsKey("something"))
    {
        return RedirectToAction("SomeActionWithAuth");
    }
    ...
}

[HttpGet]
[Authorize]
public IActionResult SomeActionWithAuth()
{
    ...
}

但是,在這種特殊情況下,我對避免重定向有嚴格的要求,因此我不能使用這種方法。

所以我的問題是:

  • 有沒有辦法在請求到達 controller 之前攔截請求,並在運行時根據每個請求決定請求是否需要身份驗證?
  • 如果那不可能,是否有辦法在運行時決定將請求路由到哪個控制器/動作? (這樣我可以有一個類似於上面的設置,有兩個具有不同身份驗證要求的操作,但不會在客戶端引起實際的 HTTP 重定向,我不能這樣做)

創建您自己的授權策略來處理此問題。

public class HeaderRequirement : IAuthorizationRequirement
{
    public HeaderRequirement(string header)
    {
        Header = header;
    }

    public string Header { get; }
}

public class HeaderRequirementHandler : AuthorizationHandler<HeaderRequirement>
{
    protected override Task HeaderRequirementHandler (
        AuthorizationHandlerContext context,
        HeaderRequirement requirement)
    {
        var hasHeader = context.Request.Headers.ContainsKey(requirement.Header);
        if (hasHeader) // if we have the header
        {
            context.Succeed(requirement); // authorization successful
        }

        return Task.CompletedTask;
    }
}

將處理程序注冊為服務

services.AddScoped<IAuthorizationHandler, HeaderRequirementHandler>();

將策略添加到授權服務

services.AddAuthorization(options =>
    {
        options.AddPolicy("SomeHeader", policy =>
            policy.Requirements.Add(new HeaderRequirement("SomeHeader")));
    });

現在你可以像這樣使用它: [Authorize(Policy = "SomeHeader")]

如果你需要它更動態一點,如果你不想注冊每一個 header 可能會被驗證,而是在運行時解釋。 您可以編寫自己的策略提供程序

暫無
暫無

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

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