2

В настоящее время при входе в систему я вставляю строку для пользователя в таблицу AccessSession, которая хранит сведения о том, какие роли у пользователя есть вместе с cookie ASP.NET_SessionId.ASP.NET custom RoleProvider - использование файлов cookie

Мой заказ реализация метода GetRolesForUser этого является:

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(); 
    } 

Вопрос у меня есть, я неправильно используя этот подход? Если файлы cookie отключены, то не будет HttpContext.Current.Request.Cookies ["ASP.NET_SessionId"]. Мой альтернативный план состоял в том, чтобы вставить объект AccessSession в сеанс, но это всегда отображается как null, когда пользовательский RoleProvider пытался получить к нему доступ.

Я мог бы использовать cacheRolesInCookie = true, но опять же, что было бы не лучше, чем описанный выше подход, так как отключить куки-файлы нарушили бы функциональность.

Спасибо, Richard

ответ

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(); 
    } 
Смежные вопросы