У меня есть случай использования, когда каждый вошедший в систему пользователь имеет набор 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
Я буду признателен за руководство, чтобы решить эту проблему.
Спасибо