Har stött på patrull!
En inloggad användare har lyckats få en annan inloggad användares användarinfo.
Jag använder en statisk användarklass med bla en sessionvariabel och ett cacheobjekt. Felet bör ligga där i.
Är inte denna kod trådsäker? Hur kan den förändras/förbättras?
public static class UserInfo
{
static string currentUserName = String.Empty;
//Sessionvariabel som håller en användarens användarnamn
public static string CurrentUserName
{
get
{
if (HttpContext.Current.Session["UserName"] != null)
{
currentUserName = HttpContext.Current.Session["UserName"].ToString();
}
return currentUserName;
}
set { HttpContext.Current.Session["UserName"] = value; }
}
static Entities.User currentUser;
//Cache objekt som håller en användare
public static Entities.User CurrentUser
{
get
{
if (CurrentUserName.Length > 0)
{
if (HttpContext.Current.Cache["UserWork" + CurrentUserName] != null)
currentUser = (Entities.User)HttpContext.Current.Cache["UserWork" + CurrentUserName];
else
{
//CurrentUser kan/får aldrig vara tom
HttpContext.Current.Response.Redirect("/?Msg=Din session har avslutats och du behöver logga in igen.");
}
}
else
HttpContext.Current.Response.Redirect("/?Msg=Din session har avslutats och du behöver logga in igen.");
return currentUser;
}
set
{
currentUser = value;
HttpContext.Current.Cache["UserWork" + CurrentUserName] = currentUser;
}
}
}
public static Entities.User CurrentUser
{
get
{
string userName = CurrentUserName;
if (userName != null)
{
Entities.User user = HttpContext.Current.Cache["UserWork" + userName];
if (user == null)
{
//CurrentUser kan/får aldrig vara tom
HttpContext.Current.Response.Redirect("/?Msg=Din session har avslutats och du behöver logga in igen.");
}
return user;
}
else
{
HttpContext.Current.Response.Redirect("/?Msg=Din session har avslutats och du behöver logga in igen.");
return null;
}
}
set
{
HttpContext.Current.Cache["UserWork" + CurrentUserName] = currentUser;
}
}
Mm, jag var inne på lite samma sak, jag återskapade dock CurrentUser om CurrentUserName inte är tom, så här:
public static Entities.User CurrentUser
{
get
{
if (CurrentUserName != null)
{
if (HttpContext.Current.Cache["UserWork" + CurrentUserName] != null)
return (Entities.User)HttpContext.Current.Cache["UserWork" + CurrentUserName];
else
{
IGenericDao<Entities.User> UserDao = new GenericDao<Entities.User>();
return UserDao.GetObject(Expression.Eq("UserName", CurrentUserName));
}
}
else
HttpContext.Current.Response.Redirect("/?Msg=Din session har avslutats och du behöver logga in igen.", true);
return null;
}
set
{
HttpContext.Current.Cache["UserWork" + CurrentUserName] = value;
}
}
Är min kod överflödig?
Kommer cacheobjektet CurrentUser någonsin att kunna vara tomt om CurrentUserName inte är tom?
För jag sätter dem samtidigt när användaren loggar in:
UserInfo.CurrentUserName = "arne";
UserInfo.CurrentUser = användare från databas;
Sedan rör jag dem inte mer.
Så då måste väl cachen finnas minst lika länge som sessionvariabeln? Eller kan cachen på något sätt avslutas när inte session gör det?