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.
Global.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_AcquireRequestState
Dies 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
});
}