将策略应用于asp.net核心应用程序中的路径

时间:2019-01-09 19:18:56

标签: asp.net-core authorization

在asp.net核心应用程序中,我使用策略(例如“ IsAdmin”)来保护应用程序的某些部分。

我在/ admin路径中有一个管理区域。我想为位于此路径下的每个控制器/页面都需要一个策略,而不是使用[Autorization]属性来装饰每个控制器。

是否可以在startup.cs中进行设置?

1 个答案:

答案 0 :(得分:0)

AFAIK,没有这样的配置为policy启用路径过滤器。解决方法是,您可以为覆盖Controller的区域创建基本控制器定义,并为此添加安全要求:

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