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