1.Украсьте действия по созданию и настройке вашего пользователя с помощью атрибута Authorize.
(Сообщите, что использование свойства Roles AuthorizeAttribute требует реализации MembershipProvider (стандартной или пользовательской) и регистрации его в web.config)
public class AccountController : Controller
{
[HttpGet, Authorize(Roles = "Admin")]
public ViewResult CreateUser()
{
return View();
}
[HttpPost, Authorize(Roles = "Admin")]
public ActionResult CreateUser()
{
//... call service method to create user
}
[HttpPost, Authorize(Roles = "Admin")]
public ActionResult AssignPageToUser(int userId, string controllerName, string ActionName)
{
//... insert record into table (UserPermissions) with attributes (userId, actionName, controllerName)
}
// other methods without decoration by authorize attribute
}
Следующие параграфы являются правильными, если вы действительно хотите иметь полный контроль над разрешениями действий отдельно для каждого пользователя.
Если вы считаете, что ваши разрешения могут группироваться по конечному и небольшому количеству ролей - вы можете декорировать все действия / контроллеры по атрибуту авторизации и указать роли, для которых доступно действие / контроллер: [Authorize("Customer, Manager, RegionalAdmin")]
и дать администратору возможность назначать роли пользователям , Но помните, что для того, чтобы получить доступ, достаточно быть только в одной из перечисленных ролей, вы не можете требовать по этому атрибуту, например, роли «Администратор» и «Менеджер».
Если вы хотите обязательно указать более одной роли, используйте несколько атрибутов:
public class MyController:Controller
{
[Authorize(Roles = "Manager")]
[Authorize(Roles = "Admin")]
public ActionResult Action1()
{
//...
}
}
2.Для ваших страниц вы можете создать свой собственный атрибут фильтра, унаследованный от атрибута authorize, который будет проверять, доступно ли действие для пользователя (я думаю, что вы хотите назначить действия, но не представления для пользователя).
public UserPermissionRequiredAttribute: AuthorizeAttribute
{
public OnAuthorization(AuthorizationContext filterContext)
{
var isAuthenticated = filterContext.HttpContext.User.Identity.IsAuthenticated;
var userName = filterContext.HttpContext.User.Identity.Name;
var actionName = filterContext.ActionDescriptior.ActionName;
var controllerName = filterContext.ActionDescriptior.ControllerDescriptor.ControllerName;
if (isAuthenticated && myUserActionPermissionsService.UserCanAccessAction(userName, actionName, contollerName)
{
filterContext.Result = HttpUnauthorizedResult(); // aborts action executing
}
}
}
3.Декоративные действия (контроллеры), доступные для пользователей, предоставленных администратором:
MySpecialController: Controller
{
[UserPermissionRequired]
Action1()
{
//...
}
[UserPermissionRequired]
Action2()
{
//...
}
Action3()
{
//...
}
}
Я не рекомендую использовать базовый контроллер для этой цели, поскольку использование атрибутов более гибкое (у вас есть контроль на уровне действия / контроллера, а не только на уровне контроллера), это лучший способ реализовать разделенную ответственность. Использование базового контроллера и атрибута фильтра соотносится с полиморфизмом и оператором коммутатора.