У нас есть приложение ASP.NET 4.5 WebForms, использующее функции проверки подлинности собственных форм и сеанса. Оба имеют тайм-аут в течение 20 минут с истечением срока годности.
Представьте себе следующий сценарий. Пользователь некоторое время работал в нашем приложении, а затем продолжает делать некоторые другие вещи, оставляя наше приложение незанятым на 20 минут. Затем пользователь возвращается в наше приложение, чтобы написать отчет. Однако, когда пользователь пытается сохранить, он/она обрабатывается экраном входа, и отчет потерян.
Очевидно, это нежелательно. Вместо этого сценария мы хотим, чтобы браузер был перенаправлен на страницу входа в тот момент, когда истек срок аутентификации или сеанса. Чтобы понять это, мы создали службу Web Api, которую можно вызвать, чтобы проверить, так ли это.
public class SessionIsActiveController : ApiController
{
/// <summary>
/// Gets a value defining whether the session that belongs with the current HTTP request is still active or not.
/// </summary>
/// <returns>True if the session, that belongs with the current HTTP request, is still active; false, otherwise./returns>
public bool GetSessionIsActive()
{
CookieHeaderValue cookies = Request.Headers.GetCookies().FirstOrDefault();
if (cookies != null && cookies["authTicket"] != null && !string.IsNullOrEmpty(cookies["authTicket"].Value) && cookies["sessionId"] != null && !string.IsNullOrEmpty(cookies["sessionId"].Value))
{
var authenticationTicket = FormsAuthentication.Decrypt(cookies["authTicket"].Value);
if (authenticationTicket.Expired) return false;
using (var asdc = new ASPStateDataContext()) // LINQ2SQL connection to the database where our session objects are stored
{
var expirationDate = SessionManager.FetchSessionExpirationDate(cookies["sessionId"].Value + ApplicationIdInHex, asdc);
if (expirationDate == null || DateTime.Now.ToUniversalTime() > expirationDate.Value) return false;
}
return true;
}
return false;
}
}
Эта служба Web Api вызывается каждые 10 секунд клиентом для проверки того, истекло ли аутентификация или сеанс. Если это так, script перенаправляет браузер на страницу входа. Это работает как шарм.
Однако вызов этой службы вызывает скользящее завершение как аутентификации, так и сеанса. Таким образом, по существу, создается бесконечная аутентификация и сеанс. Я установил точку останова в начале службы, чтобы проверить, является ли это одной из наших собственных функций, которая запускает это. Но это не так, кажется, что где-то еще глубже в ASP.NET, до выполнения службы.
- Есть ли способ отключить запуск аутентификации ASP.NET и истечения срока действия сеанса для конкретного запроса?
- Если нет, то что лучше всего для решения такого сценария?