我的DataEntityLayer中有一些变量,对于所有用户来说都是常见的,例如
public class DataEntityLayer : System.Web.UI.Page
{
public string UserName
{
get
{
if (Session["UserName"] == null)
{
GotoLoginPage();
return null;
}
else
return Session["UserName"].ToString();
}
set { Session["UserName"] = value; }
}
}
我正在使用此变量在用户登录时显示用户名,这样可以正常工作但经常变为空。如何避免这种情况或让我知道在我的图层中声明变量以在用户登录时显示用户名的方法。
答案 0 :(得分:5)
会话是临时内存,在规定的时间后过期,我相信默认是20分钟不活动。
也可能是因为您正在使用具有负载平衡的多个服务器。除非会话持久存储在数据库中,否则当您从一台服务器移动到另一台服务器时,会话将丢失。
出于上述原因,我建议避免使用这种方法。有更好,更安全的方法来处理身份验证。
P.S名为DataEntityLayer的对象不应派生自System.Web.UI.Page !!
答案 1 :(得分:2)
我完全同意@johnMc的安全性,最好使用提供完整解决方案的库或包。为了完整起见,会话丢失的原因还可能是在多线程应用程序上运行服务。如果使用IIS,则可以打开名为“ASP.Net状态服务”的服务,然后在Web配置中启用它。这为ASP.net进行了进程外会话处理。还有一种方法可以使用非IIS连接到此服务,但您必须构建一个通信器类来处理此问题。这个过程的性能很小,但我从来没有遇到任何高负载问题。
<system.web>
<sessionState mode="StateServer" />
</system.web>
(我会评论,但我还不能添加评论?):)