我在我的应用程序中使用Session
来存储一些数据,比如用户名(写你好,......)等等。另外,我使用FormsAuthentication
对用户进行身份验证,因此控制器的代码如下:
protected void SetAuthCookie(int userId)
{
FormsAuthentication.SetAuthCookie(userId.ToString(), true);
User user = Repositories.UserRepository.GetUserById(userId);
Session["name"] = user.Name;
Session["email"] = user.Email;
Session["balance"] = user.TotalBalance + " / " + user.ActiveBalance;
Session["isConfirmed"] = user.IsConfirmed;
Session["phone"] = user.Phone;
}
所以,当我重新启动应用程序后,一些代码更改会话数据被破坏,但用户仍然经过身份验证,所以我的情况非常糟糕,我想修复它。一方面,我可以在某处创建代码,检查会话数据是否正常,否则刷新它。另一方面,我可能会错过一些以正确的方式存储这些数据的技术吗?
在这种情况下,最佳解决方案是什么?
<sessionState mode="InProc" customProvider="DefaultSessionProvider">
<providers>
<add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" />
</providers>
</sessionState>
答案 0 :(得分:2)
我有一个类似的问题在 global.asax.cs 文件中解决了这个问题:如果会话为空并且请求已经过身份验证,它将强制注销。 (将一个总是sholud设置的会话值设置为检查为null)
protected void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
ForceLogoutIfSessionExpired();
}
private void ForceLogoutIfSessionExpired()
{
if (Context.Handler is IRequiresSessionState)
{
if (Request.IsAuthenticated)
{
if (HttpContext.Current.Session["name"] == null)
{
AuthenticationHandler.SignOut(Response);
Response.Redirect(FormsAuthentication.LoginUrl, true);
}
}
}