2013-05-18 4 views
1

다음은 Forms 인증을 사용하는 MVC 4 인터넷 프로젝트의 문제점입니다. 내가 호텔을 가지고 있고 승인 된 사용자가 각기 다른 역할로 액세스하도록하고 싶습니다.MVC 4 - 서로 다른 범위의 인증 된 사용자 권한을 관리하는 RoleProvider

그래서 사용자가 로그인합니다. 그런 다음 드롭 다운 목록에서 대상 호텔을 선택하면 그에 따라 응용 프로그램의 보안이 그에 따라 응답합니다.

[Authorize (Roles = "Administrator")]와 같은 것이 필요하지만 그 호텔 범위에서만 필요합니다.

내 첫 aproach가 나는 HttpContext.Session [ "HotelId을"] 얻을와 UserRolesInHotel 테이블을 쿼리 수에서이 thread

에 표시됩니다 좋아 AuthorizeAttribute에서 상속 및 AuthorizeCore을 무시했다. 즉, 나는 UserId, RoleId, HotelId와 유사한 구조로 자신 만의 역할 테이블을 가져야한다. 따라서 SimpleRolePrivider는이 작업을 수행하지 않아서 CustomeRoleProvider를 만들어야합니다. RoleProvider 메소드는 새로운 역할을 사용자에게 추가 할 때 HotelId와 같이 필요한 추가 매개 변수를 처리하지 않습니다.

대한 명확한

:

  1. 사용자 A가 사용자/암호로 로그인 -> 사용자 A 호텔 1.
  2. 에 대한 "관리자"입니다 -> 확인 (SimpleMembershipProvider)는
  3. 인증 된 사용자 A가 호텔 1 선택
  4. 인증 된 사용자 호텔 2 변경 -> 사용자 A가 나는 호텔의 수를 가질 수 있습니다 호텔 2

에서 "사용자"입니다.

  1. 사용자 A -> 호텔 (1) -> { "관리자", "사용자"}
  2. 사용자 A -> 호텔 2 -> { "사용자"}
  3. 사용자 A -> 호텔 3 -> { "소유자"}
  4. 사용자 A -> 호텔 4 -> { "관리자"}

역할 목록은 항상 동일합니다.

나는 며칠 동안이 구현에 어려움을 겪어 왔으며 나는 해법적인 해결책을 찾지 못했습니다. 모든 thougths 많이 감사하겠습니다.

감사합니다.

+0

안녕하세요, 혹시이 문제에 대한 해결책을 찾아 냈습니까? 나는 너와 같은 문제를 다루고 있음을 깨닫고있다. 감사! – SaiyanGirl

답변

0

이 내가 무슨 짓을 : 사용자 프로필

  • 추가 된 DefaultBuildingId.
  • 그때 나는 CustomRoleProvider을 작성

    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; 
    

    }

  • AuthorizeAttribute

    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."); 
    } 
    
    • 추가에게 정의를 같은 GetRolesForUser 메서드를 오버라이드 그리고 마지막으로이 그것을 사용하는 방법입니다 컨트롤러 또는 동작 레벨에서.

      [BuildingAthorize (역할 = "관리자")]

는 또한 사용자가 빌딩을 변경하고 새로운 BuildingId 세션에서 무시할 값 설정 있도록 레이아웃에 DDL 추가/db. 이렇게하면 사용자는 같은 세션에서 다른 호텔에서 일할 수 있으며 특정 호텔에 대한 액세스 영역과 기능 만 사용할 수 있습니다.