Der Sitzungsmanager meldet mich nicht ab, wenn die Sitzung abläuft. HTTPContext.Current ist Null

Ich habe dieses Problem mit meinem aktuellen Sitzungsmanager. Wenn die Sitzung abläuft, wird der Benutzer nicht abgemeldet.

In zufälligen Abständen, während der Benutzer angemeldet istHttpContext.Current istNULL Dies führt dazu, dass die Site viele Fehler generiert. Ich habe einige Techniken ausprobiert, um Benutzer nach Ablauf der Sitzung zur Anmeldung umzuleiten, ohne Erfolg.

UnterGlobal.asax Ich mache Gebrauch vonSession_End kann versucht, anzurufenLogOut Diese Methode wird jedoch ausgeführt, noch bevor sich der Benutzer anmeldet.UnterGlobal.asax Ich fügte hinzuApplication_AcquireRequestStateDies macht leider vielen Anrufen beim SSO-Dienst Platz. Es wurde auch nie umgeleitet, um sich nach Ablauf der Sitzung anzumelden. Ich habe es mit folgendem getestetFormsAuthentication.RedirectToLoginPage(); Kein Glück.

Ich fand diese Antwort vonLex Li "Warum ist HttpContext.Current null?"- es gab mir einen Einblick, was mein Problem sein könnte, obwohl meine Anwendung keine Hintergrundthreads verwendet, meineHttpContext.Current Kommt mit einigen zufälligen Anfragen auf Null zurück, passiert nicht immer.

Sitzungsmanager

   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; }
    }

Login Controller

[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
    });
}

Antworten auf die Frage(3)

Ihre Antwort auf die Frage