Применить политику к пути в основном приложении asp.net - PullRequest
0 голосов
/ 09 января 2019

В своем приложении с ядром asp.net я использую политики (например, «IsAdmin») для защиты определенных частей приложения.

У меня есть админка по пути / admin. Я хотел бы требовать политику для каждого контроллера / страницы, расположенной по этому пути, вместо того, чтобы украшать каждый контроллер атрибутом [Autorization].

Есть ли способ настроить это в startup.cs?

1 Ответ

0 голосов
/ 10 января 2019

AFAIK, нет такой конфигурации, включающей фильтр пути для политики. В качестве обходного пути вы можете создать определение базового контроллера для этой области, которое переопределяет контроллер, и добавить к нему требования безопасности:

[Authorize(Policy = "RequireElevatedRights")]
public abstract class AdminController : Controller { }

Тогда вам просто нужно убедиться, что каждый контроллер в области переопределяет AdminController вместо Controller:

[Area("Admin")]
public class HomeController : AdminController
{
    public IActionResult Index()
    {
        return View();
    }
}

Другое решение заключается в применении требования глобальной авторизации:

services.AddMvc(config =>
{

    config.Filters.Add(new AuthorizeFilter("AtLeast21"));
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

services.AddAuthorization(options =>
{

    options.AddPolicy("AtLeast21", policy =>
policy.Requirements.Add(new MinimumAgeRequirement(21)));
});

services.AddHttpContextAccessor();
services.AddSingleton<IAuthorizationHandler, MinimumAgeHandler>();

В дескрипторе вы должны проверить, является ли область конкретной:

IHttpContextAccessor _httpContextAccessor = null;

public MinimumAgeHandler(IHttpContextAccessor httpContextAccessor)
{
    _httpContextAccessor = httpContextAccessor;
}

protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,                                                       MinimumAgeRequirement requirement)
{
    var mvcContext = context.Resource as AuthorizationFilterContext;
    var descriptor = mvcContext?.ActionDescriptor as ControllerActionDescriptor;
    if (!("Admin".Equals(descriptor.RouteValues["area"])))
    {
        context.Succeed(requirement);
    }
    ...........
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...