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")] и дать админу возможность назначать роли пользователям. Но помните, что для получения доступа достаточно быть только в 1 из перечисленных ролей, по этому атрибуту нельзя требовать, например, и роли Администратора, и Менеджера. Если вы хотите требовать обязательно более 1 роли, используйте несколько атрибутов:
public class MyController:Controller
{
[Authorize(Roles = "Manager")]
[Authorize(Roles = "Admin")]
public ActionResult Action1()
{
//...
}
}
2. Для своих страниц вы можете создать свой собственный атрибут фильтра, унаследованный от атрибута авторизации, который будет проверять, доступно ли действие для пользователя (я думаю, вы хотите назначать пользователю действия, но не просмотры).
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()
{
//...
}
}
Я не рекомендую использовать базовый контроллер для этой цели, потому что использование атрибута более гибкое (у вас есть контроль на уровне действия/контроллера, а не только на уровне контроллера), это лучший способ реализовать разделенную ответственность. Использование базового контроллера и атрибута фильтра коррелирует как полиморфизм и оператор переключения.
person
Evgeny Levin
schedule
07.06.2011