Я пытаюсь настроить авторизацию в веб-приложении ASP.NET Core 1.0 (MVC 6).
Более ограничительный подход. По умолчанию я хочу ограничить все контроллеры и методы действий пользователями с ролью Admin
. Итак, я добавляю глобальный атрибут authorize, например:
AuthorizationPolicy requireAdminRole = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.RequireRole("Admin")
.Build();
services.AddMvc(options => { options.Filters.Add(new AuthorizeFilter(requireAdminRole));});
Затем я хочу разрешить пользователям с определенными ролями обращаться к конкретным контроллерам. Например:
[Authorize(Roles="Admin,UserManager")]
public class UserControler : Controller{}
Что, конечно, не будет работать, так как "глобальный фильтр" не позволит UserManager
получить доступ к контроллеру, поскольку они не являются "админами".
В MVC5 я смог реализовать это, создав настраиваемый атрибут authorize и поместив туда свою логику. Затем используйте этот настраиваемый атрибут как глобальный. Например:
public class IsAdminOrAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
ActionDescriptor action = filterContext.ActionDescriptor;
if (action.IsDefined(typeof(AuthorizeAttribute), true) ||
action.ControllerDescriptor.IsDefined(typeof(AuthorizeAttribute), true))
{
return;
}
base.OnAuthorization(filterContext);
}
}
Я попытался создать пользовательский AuthorizeFilter
, но не успел. API кажется другим.
Итак, мой вопрос: возможно ли установить политику по умолчанию, а затем переопределить ее для определенных контроллеров и действий. Или что-то подобное. Я не хочу идти с этим
[Authorize(Roles="Admin,[OtherRoles]")]
на каждом контроллере/действии, поскольку это потенциальная проблема безопасности. Что произойдет, если я случайно забуду поставить роль Admin
.