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.

DebajoGlobal.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
    });
}

Respuestas a la pregunta(3)

Su respuesta a la pregunta