Диспетчер сеансов не выйдет из системы после окончания сеанса, HTTPContext.Current равен Null
У меня возникла эта проблема с моим текущим менеджером сеансов, когда сеанс истекает, он не выйдет из системы.
Через определенные промежутки времени, когда пользователь входит вHttpContext.Current
являетсяNULL
в результате чего сайт генерирует много ошибок. Я попробовал несколько методов, чтобы перенаправить пользователя для входа в систему по истечении сеанса, но безуспешно.
Global.asax
Я используюSession_End
может попытаться позвонитьLogOut
метод, но он выполняется еще до входа пользователя.ПодGlobal.asax
я добавилApplication_AcquireRequestState
, но, к сожалению, это делает много звонков в службу единого входа. Кроме того, он никогда не перенаправляется для входа в систему по истечении сеанса. Я проверил это со следующимFormsAuthentication.RedirectToLoginPage()
; Неудачно.Я нашел этот ответЛекс Ли "Почему HttpContext.Current будет нулевым?"- это дало мне некоторое представление о том, в чем может быть моя проблема, хотя мое приложение не использует фоновые потоки, мойHttpContext.Current
возвращается с нулевым с некоторыми случайными запросами, не всегда происходит.
Менеджер сессий
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
});
}