2013-04-05 5 views
1

Например, если пользователь зарегистрирован, что было бы лучшим подходом для хранения идентификатора пользователя и/или его/ее ролей/групп? Очевидными подходами являются файлы cookie и сеанс? Какие еще варианты?Как сохранить значение во всем приложении asp.net mvc (бритва 3)?

+0

Если вы хотите сохранить значения для пользователя, я думаю, что это лучшие варианты – pollirrata

+0

Я не полностью понимаю, вы можете привести мне пример? – Chaka

+0

Я добавил более подробную информацию в ответ ... – pollirrata

ответ

0

По крайней мере, используя аутентификацию с помощью форм, вы можете поместить идентификатор пользователя и роли в билете Formst Auth.

Here'a пример того, как я сделал это:

public static HttpCookie CreateCookie(IUserIdValue userId, string name, IEnumerable<int> group, bool isPersistent = false) 
    { 
     var user = new AuthenticationTicketData() { Groups = @group, UserId = userId }; 
     var ft = new FormsAuthenticationTicket(2, name, DateTime.Now, DateTime.Now.Add(FormsAuthentication.Timeout), 
               isPersistent, user.Pack()); 
     var ck = new HttpCookie(FormsAuthentication.FormsCookieName) 
        { 
         Value = FormsAuthentication.Encrypt(ft), 
         Path = FormsAuthentication.FormsCookiePath, 
         Domain = FormsAuthentication.CookieDomain 
        }; 
     if (isPersistent) 
     { 
      ck.Expires = DateTime.Now.Add(FormsAuthentication.Timeout); 
     } 
     return ck; 
    } 


public static string Pack(this AuthenticationTicketData data) 
    { 
     if (data == null) throw new ArgumentNullException("data"); 
     return String.Format("{0};{1}",PackUserId(data.UserId),string.Join(",",data.Groups)); 
    } 

    static string PackUserId(IUserIdValue uid) 
    { 
     if (uid == null) throw new ArgumentNullException("uid"); 
     var tpn = uid.GetType().GetFullTypeName(); 
     return String.Format("{0}|{1}",tpn,uid.ToString()); 
    } 

public static HttpCookie SetAuthCookie(this HttpResponse response,IUserIdValue userId, string name, IEnumerable<int> group, bool isPersistent = false) 
    { 
     var ck = CreateCookie(userId, name, group, isPersistent); 
     response.AppendCookie(ck); 
     return ck; 
    } 

Другой альтернативой является сохранение сеанса пользователя (никакого отношения к сессии) в базе данных, что-то вроде таблицы (справ, имя пользователя, идентификатор пользователя , роли, ExpireAt). Но этот подход более подходит, если вы хотите отслеживать, когда пользователь входит в систему/выходит из системы, или если вы используете собственную аутентификацию (а не Forms auth).

+0

Спасибо за пример и объяснение! – Chaka

0

Если вы хотите сохранить значения для каждого пользователя, I сеанс - лучший вариант. Сессия создается для каждого пользователя/браузера. Каждый пользователь имеет свой собственный объект сеанса, поэтому таким образом вы можете сохранить информацию о ролях пользователей в приложении до окончания сеанса.

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

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