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
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();
Vous pouvez injecter un IHttpContextAccessor
dans votre constructeur AuthorizationHandler
s.
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
}
}
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;
}