2013-05-18 5 views
1

Вот моя проблема с моим интернет-проектом MVC 4 с использованием проверки подлинности с помощью форм. Допустим, у меня есть отели, и я хочу, чтобы авторизованные пользователи обращались к ним под разными ролями.MVC 4 - RoleProvider для управления полномочиями аутентифицированных пользователей с различными областями

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

Мне нужно что-то вроде [Авторизовать (Роли = «Администратор»)], но только в той области отеля.

Мой первый был унаследовать Подход от AuthorizeAttribute и переопределить AuthorizeCore нравится показано в этом thread

Оттуда я мог бы получить HttpContext.Session [ «HotelId»] и запросить таблицу UserRolesInHotel. Тем не менее, у меня должен быть свой собственный ролевой стол со структурой, подобной UserId, RoleId, HotelId. Поэтому SimpleRolePrivider подходит для этой задачи, и я буду вынужден создать CustomeRoleProvider. Методы RoleProvider не обрабатывают дополнительные параметры, поскольку мне нужно, чтобы HotelId добавлял новую роль пользователю.

Для уточнения:

  1. Пользователь A входит в систему с пользователя/пароль -> OK (SimpleMembershipProvider)
  2. Аутентифицированный Пользователь A выбирает отель 1 -> Пользователь A является "Администратор" для гостиницы 1.
  3. Зарегистрированный пользователь изменение в отель 2 -> User A является "Пользователь" в гостинице 2

я могу иметь любое количество отелей.

  1. Пользователь A -> Hotel 1 -> { "Администратор", "Пользователь"}
  2. Пользователь A -> Hotel 2 -> { "Пользователь"}
  3. Пользователь A -> Hotel 3 -> { "Владелец"}
  4. Пользователь A -> Hotel 4 -> { "Администратор"}

список ролей всегда одинакова.

Я боролся с этой реализацией в течение нескольких дней, и я не мог придумать рациональное решение. Любые тысячи будут высоко оценены.

Спасибо!

+0

Эй, вы когда-нибудь выяснили решение этой проблемы? Я обнаружил, что имею дело с той же проблемой, что и у вас = /. Благодаря! – SaiyanGirl

ответ

0

Это то, что я сделал:

  • Добавлен DefaultBuildingId в профиле пользователя.
  • Затем я создал CustomRoleProvider и перекрытая метод GetRolesForUser как этот

    public override string[] GetRolesForUser(string userName) 
    { 
        if (HttpContext.Current.Session != null) 
        { 
         var user = _userRepository.GetByName(userName); 
    
         if (!user.IsActive) 
         { 
          throw new ApplicationException(string.Format("some message {0}", userName)); 
         } 
    
         if (HttpContext.Current.Session["BuildingId"] == null) 
         { 
          var building = _buildingRepository.Get(user.DefaultBuildingId); 
          if (building == null) 
          { 
           throw new ApplicationException("error message"); 
          } 
    
          HttpContext.Current.Session["BuildingId"] = building.BuildingId; 
         } 
    
         int buildingId = Convert.ToInt32(HttpContext.Current.Session["BuildingId"]); 
         return _userRepository.GetRolesForUserInBuilding(user.UserId, buildingId).ToArray(); 
        } 
    
        throw new ApplicationException("error message."); 
    } 
    
    • Добавлен пользовательский AuthorizeAttribute

      protected override bool AuthorizeCore(HttpContextBase httpContext) 
      { 
      var authorized = base.AuthorizeCore(httpContext); 
      if (!authorized) 
      { 
          return false; 
      } 
      
      var repo = UnityManager.Resolve<IUserRepository>(); 
      var buildingId = (int)httpContext.Session["BuildingId"]; 
      var userName = httpContext.User.Identity.Name; 
      var user = repo.GetByName(userName); 
      var userRolesInBuilding = repo.GetRolesForUserInBuilding(user.UserId, buildingId); 
      
      foreach (var role in Roles.Split(',')) 
      { 
          if (userRolesInBuilding.Contains(role.Trim())) 
          { 
           return true; 
          } 
      } 
      
      return false; 
      

      }

    • И, наконец, это то, как использовать его на контроллере или уровне действия.

      [BuildingAthorize (роли = «Администраторы»)]

Я также добавил DDL в макете, чтобы позволить пользователю изменить здание и установить новый BuildingId заменяющий значение на сессии/дб. Таким образом, пользователь может работать в разных отелях на одном и том же сеансе и только для доступа к ним и функциональности, которые он имеет для этого конкретного отеля.

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

  • Нет связанных вопросов^_^