web-dev-qa-db-fra.com

Comment accéder à HttpContext actuel dans ASP.NET Core 2 Autorisation basée sur une stratégie personnalisée avec AuthorizationHandlerContext

Comment puis-je accéder à HttpContext actuel pour vérifier l'itinéraire et les paramètres dans AuthorizationHandlerContext d'une autorisation basée sur des stratégies personnalisées dans ASP.NET Core 2?

Exemple de référence: autorisation basée sur une stratégie personnalisée

16
Hrvoje Kusulja

Vous devez injecter une instance d'un IHttpContextAccessor dans votre AuthorizationHandler.

Dans le contexte de votre exemple , cela peut ressembler à ceci:

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);
        }
    }
}

Vous devrez peut-être l'enregistrer dans votre configuration DI (si l'une de vos dépendances ne l'a pas déjà fait), comme suit:

services.AddHttpContextAccessor();
42
CalC

Vous pouvez injecter un IHttpContextAccessor dans votre constructeur AuthorizationHandlers.

par exemple.

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
    }
}
4
JamesT

Sans injection, solution simple!

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