/// <summary> /// Checks if the request carries a valid long-term cookie, and replaces it with a new valid cookie. /// If a hijack is performed, the response headers will be flushed. /// Callers should check the flush status after calling this method. /// </summary> /// <returns><c>True</c> if the long-term cookie is valid, <c>false</c> otherwise.</returns> /// <param name="context">The http context.</param> protected virtual async Task <bool> PerformLongTermLogin(IHttpContext context) { if (!UseLongTermCookieStorage || LongTermStorage == null) { return(false); } var longterm = context.Request.Cookies[AuthCookieName]; if (string.IsNullOrWhiteSpace(longterm)) { return(false); } var ltc = new LongTermCookie(longterm); if (!ltc.IsValid) { return(false); } var lts = await LongTermStorage.GetLongTermLoginAsync(ltc.Series); if (Utility.IsNullOrExpired(lts)) { return(false); } if (!PBKDF2.ComparePassword(ltc.Token, lts.Token)) { await LongTermStorage.DropAllLongTermLoginsAsync(lts.UserID, lts.Series); SetHijackError(context); await context.Response.FlushHeadersAsync(); return(false); } await PerformLoginAsync(context, lts.UserID, lts.Series, true); return(true); }
/// <summary> /// Handles the request /// </summary> /// <returns>The awaitable task.</returns> /// <param name="context">The requests context.</param> public async Task <bool> HandleAsync(IHttpContext context) { var xsrf = context.Request.Headers[XSRFHeaderName] ?? context.Request.Cookies[XSRFCookieName]; var cookie = context.Request.Cookies[AuthSessionCookieName]; var longterm = context.Request.Cookies[AuthCookieName]; var droppedxsrf = false; if (!string.IsNullOrWhiteSpace(xsrf)) { var session = await ShortTermStorage.GetSessionFromXSRFAsync(xsrf); if (session != null) { await ShortTermStorage.DropSessionAsync(session); droppedxsrf = true; } context.Response.AddCookie(XSRFCookieName, "", path: CookiePath, expires: new DateTime(1970, 1, 1), maxage: 0); } if (!string.IsNullOrWhiteSpace(cookie)) { var session = await ShortTermStorage.GetSessionFromCookieAsync(cookie); if (session != null) { await ShortTermStorage.DropSessionAsync(session); } if (session != null || droppedxsrf) { context.Response.AddCookie(AuthSessionCookieName, "", path: CookiePath, expires: new DateTime(1970, 1, 1), maxage: 0); } } if (!string.IsNullOrWhiteSpace(longterm)) { if (LongTermStorage != null) { var pbkdf2 = new LongTermCookie(longterm); if (pbkdf2.IsValid) { var lts = await LongTermStorage.GetLongTermLoginAsync(pbkdf2.Series); if (lts != null) { await LongTermStorage.DropLongTermLoginAsync(lts); } } } context.Response.AddCookie(AuthCookieName, "", path: CookiePath, expires: new DateTime(1970, 1, 1), maxage: 0); } context.Response.StatusCode = (HttpStatusCode)ResultStatusCode; context.Response.StatusMessage = ResultStatusMessage; if (!string.IsNullOrWhiteSpace(RedirectUrl)) { context.Response.Headers["Location"] = RedirectUrl; } return(true); }
/// <summary> /// Handles the request /// </summary> /// <returns>The awaitable task.</returns> /// <param name="context">The requests context.</param> public async Task <bool> HandleAsync(IHttpContext context) { var xsrf = context.Request.Headers[XSRFHeaderName] ?? context.Request.Cookies[XSRFCookieName]; var cookie = context.Request.Cookies[AuthSessionCookieName]; var longterm = context.Request.Cookies[AuthCookieName]; var droppedxsrf = false; if (!string.IsNullOrWhiteSpace(xsrf)) { var session = await ShortTermStorage.GetSessionFromXSRFAsync(xsrf); if (session != null) { // Kill the existing record await ShortTermStorage.DropSessionAsync(session); droppedxsrf = true; // Register a new one on the same XSRF token, // but without any user attached await ShortTermStorage.AddSessionAsync(new SessionRecord() { UserID = null, Cookie = null, XSRFToken = session.XSRFToken, Expires = DateTime.Now.AddSeconds(ShortTermExpirationSeconds) }); } //context.Response.AddCookie(XSRFCookieName, "", path: CookiePath, expires: new DateTime(1970, 1, 1), maxage: 0); } if (!string.IsNullOrWhiteSpace(cookie)) { var session = await ShortTermStorage.GetSessionFromCookieAsync(cookie); if (session != null) { await ShortTermStorage.DropSessionAsync(session); } if (session != null || droppedxsrf) { context.Response.AddCookie(AuthSessionCookieName, "", path: CookiePath, expires: new DateTime(1970, 1, 1), maxage: 0); } } if (!string.IsNullOrWhiteSpace(longterm)) { if (LongTermStorage != null) { var pbkdf2 = new LongTermCookie(longterm); if (pbkdf2.IsValid) { var lts = await LongTermStorage.GetLongTermLoginAsync(pbkdf2.Series); if (lts != null) { await LongTermStorage.DropLongTermLoginAsync(lts); } } } context.Response.AddCookie(AuthCookieName, "", path: CookiePath, expires: new DateTime(1970, 1, 1), maxage: 0); } context.Response.StatusCode = (HttpStatusCode)ResultStatusCode; context.Response.StatusMessage = ResultStatusMessage; if (!string.IsNullOrWhiteSpace(RedirectUrl)) { context.Response.Headers["Location"] = RedirectUrl; } return(true); }