Как вставить ControllerContext в startup.cs в ASP.Net-Core 2.2

У меня есть случай использования, когда каждый вошедший в систему пользователь имеет набор URL-адресов, к которым он / она может получить доступ независимо от его / ее роли. Я пытаюсь реализовать политику в ASP.Net-core 2.2 для достижения этой цели. Каждый из URL-адресов, доступных пользователю, будет зарегистрирован как утверждение, когда пользователь зарегистрирован, и пока запрос выполняется аутентифицированным пользователем, делается попытка сравнить запрошенный URL / путь с утверждениями URL, зарегистрированными для пользователя.

Поскольку я пытаюсь использовать для этого политику авторизации, я создал следующие требования авторизации и обработчик.

public class AccessPermissionRequirement : IAuthorizationRequirement
{
    public ControllerContext controllerContext { get; }
    public string routeArea = "";

    public AccessPermissionRequirement(ControllerContext _controllerContext, string RouteArea ="")
    {
        controllerContext = _controllerContext;
        routeArea = RouteArea;
    }

}

public class AccessPermissionHandler : AuthorizationHandler<AccessPermissionRequirement>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, AccessPermissionRequirement requirement)
    {
        if (!context.User.Identity.IsAuthenticated)
        {
            return Task.CompletedTask;
        }
        var actionName = requirement.controllerContext.ActionDescriptor.ActionName;
        var controllerName = requirement.controllerContext.ActionDescriptor.ControllerName;

        var route = controllerName + "/" + actionName;
        if (context.User.HasClaim("Routes", route))
        {
            context.Succeed(requirement);
        }
        return Task.CompletedTask;
    }
}

Поскольку класс AccessPermissionRequirement требует внедрения ControllerContext в конструктор, чтобы я мог иметь доступ к текущему запросу (вне контроллера), мне сложно зарегистрировать политику в методе ConfigureServices класса Startup.cs.

Ниже показано, что я сделал, но не работает.

 services.AddAuthorization(options => {
            options.AddPolicy("CheckAccess", policy => policy.Requirements.Add(new AccessPermissionRequirement(ControllerContext controllerContext)));
        });

Я получаю следующую ошибку

ControllerContext - это тип, который недопустим в данном контексте.

Итак, я застрял здесь, потому что не знаю, как решить эту проблему.

Извините, я впервые пытаюсь реализовать политику в ASP.Net-core

Я буду признателен за руководство, чтобы решить эту проблему.

Спасибо


person Josh    schedule 01.09.2019    source источник
comment
Вы можете удалить ControllerContext из требования. Требование фактически является просто контейнером для хранения параметров. . Это RequirementHandler, который имеет доступ к контексту и обрабатывает требования.   -  person Ruard van Elburg    schedule 14.09.2019


Ответы (1)


Кажется, IAuthorizationFilter идеально подходит для вашего случая. По этому поводу есть хорошее обсуждение:

Как создать настраиваемый атрибут AuthorizeAttribute в ASP. NET Core?

person Ivan    schedule 01.09.2019
comment
Ага. Это альтернатива, которую я сейчас пытаюсь реализовать, если у меня нет решения для использования политики авторизации. Спасибо, что подтвердили это - person Josh; 01.09.2019