Вот что я делаю, чтобы сохранить объект вместо имени, которое я считаю менее полезным.
В моем контроллере аккаунта:
public static User CacheUserInSession(User user)
{
Contract.Assert(user != null);
if (user == null) // Not found, name may have changed
{
new FormsAuthenticationService().SignOut();
}
else
{
// Save off the user for later use by other classes
ContextCache<User>.Set(user, ContextCache.AspNetUserSessionCache);
ContextCache<int>.Set(user.RowId, ContextCache.UserIdSessionCache);
}
return user;
}
public static User GetUserFromSession()
{
var user = ContextCache<User>.Get(ContextCache.AspNetUserSessionCache);
return user;
}
Мой класс кеша:
public class ContextCache<T>
{
public static void Set(T objectToCache, string key)
{
System.Web.HttpContext.Current.Items.Add(key, objectToCache);
}
public static T Get(string key)
{
return (T)System.Web.HttpContext.Current.Items[key];
}
}
Я вызываю CacheUserInSession из Application_AuthenticateRequest, передавая мой объект / модель User, который я читаю из базы данных.
Когда я хочу получить пользователя, я делаю этот вызов:
var user = AccountController.GetUserFromSession();
Используя обертку кеша, вы можете сохранять / извлекать любые объекты, которые вам нужны.
Нет беспорядка. Без суеты.