Как получить доступ к текущему HttpContext в ASP.NET Core 2 Пользовательская политическая авторизация с авторизациейHandlerContext

Как я могу получить доступ к текущему HttpContext, чтобы проверить маршрут и параметры внутри AuthorizationHandlerContext пользовательской авторизации на основе политик в ASP.NET Core 2?

Пример ссылки: Пользовательская авторизация на основе политик

Ответ 1

Вы должны внедрить экземпляр 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();

Ответ 2

Вы можете ввести 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
    }
}

Ответ 3

Без инъекций, простое решение!

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