簡體   English   中英

如何訪問 ASP.NET Core 2 使用 AuthorizationHandlerContext 的自定義基於策略的授權中的當前 HttpContext

[英]How to access current HttpContext in ASP.NET Core 2 Custom Policy-Based Authorization with AuthorizationHandlerContext

如何訪問當前 HttpContext 以檢查 ASP.NET Core 2 內基於策略的自定義授權的 AuthorizationHandlerContext 內的路由和參數?

參考示例: 基於策略的自定義授權

您應該將IHttpContextAccessor的實例注入到AuthorizationHandler

在您的示例的上下文中,這可能類似於以下內容:

public class BadgeEntryHandler : AuthorizationHandler<EnterBuildingRequirement>
{
    IHttpContextAccessor _httpContextAccessor = null;

    public BadgeEntryHandler(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    protected override Task HandleRequirementAsync(
        AuthorizationContext context, 
        EnterBuildingRequirement requirement)
    {
        HttpContext httpContext = _httpContextAccessor.HttpContext; // Access context here

        if (context.User.HasClaim(c => c.Type == ClaimTypes.BadgeId &&
                                       c.Issuer == "http://microsoftsecurity"))
        {
            context.Succeed(requirement);
            return Task.FromResult(0);
        }
    }
}

您可能需要在DI設置中注冊它(如果您的依賴項之一尚未注冊),如下所示:

services.AddHttpContextAccessor();

您可以將IHttpContextAccessor注入到AuthorizationHandler的構造函數中。

例如

public class MyAuthorizationHandler : AuthorizationHandler<MyRequirement>
{
    private IHttpContextAccessor _contextAccessor;

    public MyAuthorizationHandler (IHttpContextAccessor contextAccessor)
    {
        _contextAccessor = contextAccessor;
    }

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
        MinimumPermissionLevelRequirement requirement) {

        var httpContext = _contextAccessor.HttpContext;
        // do things
    }
}

如果它是 MVC 上下文,您可以從AuthorizationContext context訪問HttpContextRouteData和 MVC 提供的所有其他內容:

var mvcContext = context.Resource as Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext;

if (mvcContext != null)
{
    // Examine MVC specific things like routing data.
}

https://jakeydocs.readthedocs.io/en/latest/security/authorization/policies.html#accessing-mvc-request-context-in-handlers

在 .NET 5 中,您可以使用以下代碼:

if(context.Resource.GetType().FullName == "Microsoft.AspNetCore.Http.DefaultHttpContext")
{
    var httpContext = context.Resource as Microsoft.AspNetCore.Http.DefaultHttpContext;

}

無需注射,簡單的解決方案!

protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, MyRequirement requirement)
        {
                var authFilterCtx = (Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext)context.Resource;
                var httpContext = authFilterCtx.HttpContext;  
        }

這是來自微軟文檔(ASP.NET Core 6):

HandleRequirementAsync方法有兩個參數:一個AuthorizationHandlerContext和正在處理的TRequirement MVC 或 SignalR 等框架可以自由地將任何 object 添加到AuthorizationHandlerContext上的 Resource 屬性以傳遞額外信息。

使用端點路由時,授權通常由授權中間件處理。 在這種情況下, Resource屬性是 HttpContext 的一個實例。 上下文可用於訪問當前端點,該端點可用於探測您要路由到的底層資源。 例如:

if (context.Resource is HttpContext httpContext)
{
    var endpoint = httpContext.GetEndpoint();
    var actionDescriptor = endpoint.Metadata.GetMetadata<ControllerActionDescriptor>();
    ...
}

正如其他人所提到的,注入IHttpContextAccessor是訪問HttpContext的另一種方式。

暫無
暫無

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

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