2

현재 로그인시 사용자가 ASP.NET_SessionId 쿠키와 함께 사용하는 역할에 대한 세부 정보를 유지하는 AccessSession 테이블에 사용자의 행을 삽입하고 있습니다. 이것의 GetRolesForUser 방법의ASP.NET 사용자 정의 RoleProvider - 쿠키 사용

내 사용자 정의 구현은 다음과 같습니다

public override string[] GetRolesForUser(string username) 
    { 
     List<string> roles = new List<string>(); 
     string[] rolesArray; 
     char[] splitter = { '|' };    

     string sessionId = HttpContext.Current.Request.Cookies["ASP.NET_SessionId"].Value; 
     AccessSession sessionObject = AccessSession.Get(sessionId); 

     if (sessionObject != null) 
     { 
      rolesArray = sessionObject.Roles.Split(splitter); 

      foreach (string role in rolesArray) 
      { 
       if (!String.IsNullOrEmpty(role)) 
       { 
        roles.Add(role); 
       } 
      } 
     } 
     return roles.ToArray(); 
    } 

내가 가진 문제는 내가 잘못이 방법을 사용하고있다? 쿠키가 비활성화되어 있으면 HttpContext.Current.Request.Cookies [ "ASP.NET_SessionId"]가 없습니다. 나의 대안 계획은 Session에 AccessSession 객체를 삽입하는 것이지만, 사용자 정의 RoleProvider가 액세스하려고 시도 할 때 항상 null로 표시됩니다.

cacheRolesInCookie = true를 사용할 수 있지만 쿠키를 비활성화하면 위의 방법보다 더 나을 수 있습니다.

덕분에, 리처드

답변

3

이 잘 나는 이미 내 모든 역할을 개최은 FormsAuthenticationTicket에서 역할을 얻어서 결국 그것을 해결하기 위해 관리. 다음은 코드의 예입니다.

public override string[] GetRolesForUser(string username) 
    { 
     List<string> roles = new List<string>(); 
     string[] rolesArray = new string[] { }; 
     char splitter = Advancedcheck.BLL.Common.Const.default_splitter; 

     if (HttpContext.Current.User != null) 
     { 
      if (HttpContext.Current.User.Identity.IsAuthenticated) 
      { 
       if (HttpContext.Current.User.Identity is FormsIdentity) 
       { 
        FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity; 
        FormsAuthenticationTicket ticket = id.Ticket; 

        rolesArray = ticket.UserData.Split(splitter); 

        HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(id, rolesArray); 
       } 
      } 
     } 

     if (rolesArray.Length > 0) 
     { 
      foreach (string role in rolesArray) 
      { 
       if (!String.IsNullOrEmpty(role)) 
       { 
        roles.Add(role.ToLower()); 
       } 
      } 
     } 
     return roles.ToArray(); 
    }