我当前的会话管理器遇到这个问题,当会话过期时,它不会注销用户。
用户登录时以随机间隔HttpContext.Current
is NULL
导致网站产生许多错误。我尝试了几种技术来在会话过期时重定向用户登录,但没有成功。
- Under
Global.asax
我正在利用Session_End
可以尝试
称呼LogOut
方法,但这甚至在用户登录之前就被执行
在。
- Under
Global.asax
我添加了Application_AcquireRequestState
,但遗憾的是,这导致了对 SSO 服务的许多调用。此外,它永远不会在会话过期时重定向到登录。我用以下方法测试了它FormsAuthentication.RedirectToLoginPage()
;没有运气。
我找到了这个答案Lex Li https://stackoverflow.com/users/11182/lex-li "为什么 HttpContext.Current 为空? https://stackoverflow.com/questions/19509672/why-httpcontext-current-be-null“ - 它让我对我的问题可能是什么有了一些了解,即使我的应用程序没有使用后台线程,我的HttpContext.Current
一些随机请求返回 Null,并不总是发生。
会话管理器
public class SessionManager
{
private const string SessionKey = "AppSession";
private SessionManager()
{
GUID = new Guid();
FirstName = String.Empty;
LastName = String.Empty;
Email = String.Empty;
SessionExpiration = new DateTime();
}
// Gets the current session.
public static SessionManager Current
{
get
{
if(HttpContext.Current != null)
{
if (HttpContext.Current.Session[SessionKey] == null)
{
var model = new SessionManager();
HttpContext.Current.Session[SessionKey] = model;
}
return (SessionManager)HttpContext.Current.Session[SessionKey];
}
else
{
return null;
}
}
}
public static void LogOffUser()
{
//SSO is a seperate service, I need to stay insync.
var ssoAuth = new SSOAuth();
if(Current != null)
ssoAuth.SSOLogoffUser(Current.GUID);
FormsAuthentication.SignOut();
FormsAuthentication.RedirectToLoginPage();
}
public Guid GUID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public DateTime SessionExpiration { get; set; }
}
登录控制器
[HttpPost]
[AllowAnonymous]
public JsonResult Login(LoginViewModel user)
{
var ssoAuth = new SSOAuth();
var sessionObject = ssoAuth.SSOLoginUser(user.Email, user.Password);
if (sessionObject != null && sessionObject.SessionId != Guid.Empty)
{
SessionManager.Current.Email = sessionObject.UserId;
SessionManager.Current.GUID = sessionObject.SessionId;
SessionManager.Current.FirstName = sessionObject.FirstName;
SessionManager.Current.LastName = sessionObject.LastName;
SessionManager.Current.SessionExpiration = sessionObject.SessionExpiration;
//Grab difference in time to get session timeout in minutes.
var differenceInTime = SessionManager.Current.SessionExpiration - DateTime.Now;
Session.Timeout = differenceInTime.Minutes;
//Authenticate user
FormsAuthentication.SetAuthCookie(user.Email, false);
//We return JSON, Its an AJAX Call.
return Json(new
{
redirectUrl = "/Home.mvc/Home/Index",
isRedirect = true
});
}
return Json(new
{
redirectUrl = string.Empty,
isRedirect = false
});
}
正如评论中所确认的,您正在设置应用程序池的Maximum number of worker processes
到一个值高于1并使用In-Process Mode
对于会话状态。
我很确定这是问题所在HttpContext.Current.Session
随机为空代替HttpContext.Current
.
InProc
会话状态和multiple working processes
不兼容. With InProc
会话状态,您的会话状态存储在工作进程内存中并且不在工作进程之间共享=> 当您的请求由不同的进程提供服务时,这会导致会话状态随机丢失。
在你的情况下,设置Maximum number of worker processes
改为 1 应该可以解决问题。
如果您正在寻找多工作进程解决方案,您应该使用会话状态服务或数据库将会话状态存储在进程外:http://tutorials.csharp-online.net/ASP.NET_State_Management%E2%80%94Storing_Session_State_out_of_Process http://tutorials.csharp-online.net/ASP.NET_State_Management%E2%80%94Storing_Session_State_out_of_Process
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)