2013-05-18 1 views
1

Voici mon problème avec mon projet Internet MVC 4 utilisant l'authentification par formulaires. Disons que j'ai des hôtels et je veux que les utilisateurs autorisés accèdent chacun sous différents rôles. L'utilisateur se connecte. Ensuite, à partir d'une liste déroulante, l'hôtel cible est sélectionné et la sécurité de l'application réagit en conséquence.MVC 4 - RoleProvider pour gérer les autorisations des utilisateurs authentifiés avec différentes portées

J'aurais besoin de quelque chose comme [Authorize (Roles = "Administrator")] mais seulement dans cette portée d'hôtel.

Ma première aproche héritait de AuthorizeAttribute et passer outre AuthorizeCore LIKE est montré dans ce thread

De là, je pourrais obtenir le HttpContext.Session [ « HotelId »] et interroger une table de UserRolesInHotel. Cela dit, je devrais avoir ma propre table de rôles avec une structure similaire à UserId, RoleId, HotelId. Donc SimpleRolePrivider est court à cette tâche et je serais obligé de créer un CustomeRoleProvider. Les méthodes RoleProvider ne gèrent pas les paramètres supplémentaires, car j'ai besoin de HotelId lorsque j'ajoute un nouveau rôle à un utilisateur.

Pour plus de précisions:

  1. utilisateur ouvre une session avec l'utilisateur/mot de passe -> OK (SimpleMembershipProvider)
  2. assermentée Un utilisateur sélectionne Hôtel 1 -> Un utilisateur est un pour Hôtel "Administrateur" 1.
  3. assermentée utilisateur un changement à l'Hôtel 2 -> L'utilisateur a est un « utilisateur » dans Hôtel 2

Je peux avoir un certain nombre d'hôtels.

  1. utilisateur A -> Hôtel 1 -> { "Administrateur", "Utilisateur"}
  2. utilisateur A -> Hôtel 2 -> { "utilisateur"}
  3. utilisateur A -> Hôtel 3 -> { "Propriétaire"}
  4. utilisateur A -> Hôtel 4 -> { "administrateur"}

la liste des rôles est toujours le même.

Je suis aux prises avec cette implémentation depuis quelques jours et je n'ai pas pu trouver une solution pratique. Toute idée serait très appréciée.

Merci!

+0

Salut, avez-vous déjà trouvé une solution à ce problème? Je me trouve face au même problème que vous avez = /. Merci! – SaiyanGirl

Répondre

0

C'est ce que je l'ai fait:

  • Ajouté un DefaultBuildingId au profil de l'utilisateur.
  • Ensuite, je créé un CustomRoleProvider et overrided méthode GetRolesForUser comme celui-ci

    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."); 
    } 
    
    • Ajout d'une commande 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; 
      

      }

    • Et enfin voici comment l'utiliser au niveau du contrôleur ou de l'action.

      [BuildingAthorize (rôles = « Administrateurs »)]

J'ai aussi ajouté un ddl à la mise en page pour permettre à l'utilisateur de changer le bâtiment et définir le nouveau BuildingId redéfinissant la valeur à la session/db. De cette façon, un utilisateur peut travailler dans différents hôtels au cours d'une même session et accéder uniquement aux zones et fonctionnalités qu'il possède pour cet hôtel en particulier.

Questions connexes