Как я могу получить доступ к текущему HttpContext, чтобы проверить маршрут и параметры внутри AuthorizationHandlerContext пользовательской авторизации на основе политик в ASP.NET Core 2?
Пример ссылки: Пользовательская авторизация на основе политик
Как я могу получить доступ к текущему HttpContext, чтобы проверить маршрут и параметры внутри AuthorizationHandlerContext пользовательской авторизации на основе политик в ASP.NET Core 2?
Пример ссылки: Пользовательская авторизация на основе политик
Вы должны внедрить экземпляр 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
}
}
Без инъекций, простое решение!
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, MyRequirement requirement)
{
var authFilterCtx = (Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext)context.Resource;
var httpContext = authFilterCtx.HttpContext;
}