У меня есть несколько приложений в одном домене, которые совместно используют билет для проверки подлинности с помощью форм для единого входа. У нас также есть javascript на каждой странице, который предупредит пользователя за 2 минуты до истечения срока его сеанса и позволит ему выйти из системы или продлить сеанс. Когда обратный отсчет достигает 0, они автоматически выходят из системы. Это все прекрасно работает. Тем не менее, он терпит неудачу, когда пользователь открывает несколько окон или вкладок браузера для работы с различными приложениями. Если время ожидания окна A истекло, когда пользователь работает в окне B, он выходит из B при следующем запросе.
У меня есть решение, но я не могу его реализовать. По сути, когда страница отображается, я выписываю галочки даты выпуска билета. Затем, при автоматическом выходе из системы, я хочу, чтобы ajax вызвал обработчик, чтобы проверить, соответствуют ли эти отметки текущим отметкам в билете проверки подлинности форм. Если они не совпадают, то я знаю, что другое приложение обновляет заявку, и я не буду выходить из них. Проблема в том, что я не могу создать универсальный обработчик, который не обновляет заявку, потому что мы используем slideexpiration = true.
function CompareTicket(ticks) {
$.getJSON('http://localhost/MyApp/CompareTicket.ashx?t=' + ticks, function (data) {
if (data == 0)
SessionEnd();
else
SessionExtend();
});
}
В приведенном ниже коде обработчика данные возвращаются как 0, если значение, которое я отправляю в строке запроса, соответствует тикам текущего тикета. К сожалению, простое действие запроса обработчика обновит тикет и всегда отправит обратно новый счетчик тиков.
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "application/json";
context.Response.ContentEncoding = Encoding.UTF8;
long ticketTicks = ((FormsIdentity)context.User.Identity).Ticket.IssueDate.Ticks;
if (ticketTicks == 0)
context.Response.Write("0");
else
{
long ticks = 0;
if (long.TryParse(context.Request.QueryString["t"], out ticks))
{
if (ticketTicks == ticks)
context.Response.Write("0");
else
context.Response.Write(ticketTicks.ToString());
}
else
context.Response.Write("0");
}
}
Есть какие-нибудь идеи о том, как получить JSON-запрос от сервера без продления заявки?