Например, если пользователь зарегистрирован, что было бы лучшим подходом для хранения идентификатора пользователя и/или его/ее ролей/групп? Очевидными подходами являются файлы cookie и сеанс? Какие еще варианты?Как сохранить значение во всем приложении asp.net mvc (бритва 3)?
ответ
По крайней мере, используя аутентификацию с помощью форм, вы можете поместить идентификатор пользователя и роли в билете 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).
Спасибо за пример и объяснение! – Chaka
Если вы хотите сохранить значения для каждого пользователя, I сеанс - лучший вариант. Сессия создается для каждого пользователя/браузера. Каждый пользователь имеет свой собственный объект сеанса, поэтому таким образом вы можете сохранить информацию о ролях пользователей в приложении до окончания сеанса.
Я определенно не рекомендую хранить информацию о безопасности пользователя в файле cookie, потому что это вызовет серьезное нарушение безопасности в вашем приложении.
Если вы хотите сохранить значения для пользователя, я думаю, что это лучшие варианты – pollirrata
Я не полностью понимаю, вы можете привести мне пример? – Chaka
Я добавил более подробную информацию в ответ ... – pollirrata