在asp.net核心应用程序中,我使用策略(例如“ IsAdmin”)来保护应用程序的某些部分。
我在/ admin路径中有一个管理区域。我想为位于此路径下的每个控制器/页面都需要一个策略,而不是使用[Autorization]属性来装饰每个控制器。
是否可以在startup.cs中进行设置?
答案 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);
}
...........
}