2013-07-01 4 views
1

У меня есть веб-приложение ASP.NET MVC4 со столами пользователей, ролей и rolePrivilegesASP.NET MVC ролей привилегиях основе для действий контроллера

Идентификатор_пользователя Имя пользователя Пароль] значения Идентификатор роли: 1 user1 12345 3, 2 user2 12345 1, 3 user3 12345 2

[Идентификатор роль, RoleName] значение: 1 администратор, 2 клиента, 3 гостя, 4 ...

[Идентификатор роль, Action, GrantAcce SS] значения: 1/Главная/Индекс Y 1/Главная/Настройки Y 1/Главная/Панель Y 2/Главная/Индекс Y 2/Главная/Настройки N 2/Главная/Панель Y 3/Главная/Индекс Y 3/Главная/Настройки N 3/Главная/Dashboard N

Я хотел бы, чтобы достичь следующего в ASP.NET MVC форм аутентификации:

действию контроллера должно быть динамически предоставлено отказано в доступе к роль, и если пользователь пытается получить доступ к действию контроллера, которому пользователю не предоставлен доступ, приложение должно выписать.

1) Я хочу знать, что лучший способ для достижения этой цели, так как жесткого кодирования RoleName как авторизовать (Roles = «Admin»)] не будет работать

2) У меня есть конкретные пользовательские настройки, которые должны были бы быть инициализированный при входе пользователя в систему, в формах asp.net это было сохранено в переменных сеанса, может ли это быть сделано с использованием TempData в asp.net MVC, это лучшая практика?

ответ

2

Вы можете создать фильтр действий на основе группы ролей вместо роли. Группа ролей может быть сохранена в вашей базе данных в соотношении от 1 до многих. (т. е. 1 группа имеет много ролей). Затем подайте имя группы в фильтр действия.

public class RoleGroupFilterAttribute : ActionFilterAttribute 
{ 
    public string GroupName { get; set; } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     string [] users = new string[] {}; 
     string [] roles = new string[] {}; 

     // get the roles/users for the group from your db or storage 
     // below is an example only 
     roles = mydb.RoleGroups.Where(r=>r.Name == GroupName).Select(r=>r.Roles).ToArray(); 

     var user = filterContext.HttpContext.User; 
     var userRoles = Roles.GetRolesForUser(); 

     if (!roles.Any(r => userRoles.Contains(r)) && !users.Contains(user.Identity.Name)) 
     { 
      // return a not found result or redirect to an action 
      filterContext.Result = new HttpNotFoundResult(); 
     } 
    } 
} 

Для использования вы можете просто создать страницы администрирования для управления группами ролей. И добавление фильтра к контроллеру или действие очень просто.

[RoleGroupFilter(GroupName="MyGroup")] 
public ActionResult Index() 
{ 
    return View(); 
} 

В приведенном выше примере я также разрешил добавлять пользователей в группу ролей, но это было бы на ваш выбор.

+0

Означает ли это, что группы будут предварительно определены в базе данных? – user2537609

+0

Так что просто проверьте, указано ли действие для пользователя, используя string action = filterContext.RouteData.GetRequiredString («действие»); – user2537609

+0

Да, вы должны предварительно определить группы в базе данных. – nerdybeardo

Смежные вопросы