Session Manager no me cerrará sesión cuando caduque la sesión, HTTPContext.Current es Null
Tengo este problema con mi administrador de sesión actual, cuando la sesión caduque no cerrará la sesión del usuario.
A intervalos aleatorios mientras el usuario está conectadoHttpContext.Current
esNULL
haciendo que el sitio genere muchos errores. He intentado un par de técnicas para redirigir al usuario para que inicie sesión al expirar la sesión, sin éxito.
Global.asax
Estoy haciendo uso deSession_End
puede intentar llamarLogOut
pero esto se ejecuta incluso antes de que el usuario inicie sesión.DebajoGlobal.asax
yo añadíApplication_AcquireRequestState
, pero lamentablemente esto deja paso a muchas llamadas al Servicio SSO. Además, nunca fue redirigido para iniciar sesión al expirar la sesión. Lo probé con lo siguienteFormsAuthentication.RedirectToLoginPage()
; Sin suerte.Encontré esta respuesta porLex Li "¿Por qué HttpContext.Current puede ser nulo?"- me dio una idea de cuál podría ser mi problema, aunque mi aplicación no utiliza hilos de fondo, miHttpContext.Current
vuelve Nulo con algunas solicitudes aleatorias, no siempre sucede.
Gerente de sesión
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; }
}
Controlador de inicio de sesión
[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
});
}