Запретить странице или обработчику обновлять билет FormsAuthentication

У меня есть несколько приложений в одном домене, которые совместно используют билет для проверки подлинности с помощью форм для единого входа. У нас также есть 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 с сервера, не продлевая билет?

2 ответа

В запросе asp.net модули проверки подлинности жизненного цикла выполняются до httphandlers. Одним из обходных путей является удаление этих модулей аутентификации для определенного URL, чтобы при нажатии httphandler ваш билет не обновлялся. что-то вроде этого

<location path="/MyApp/CompareTicket">
    <system.web>
        <httpModules>
            <remove name="FormsAuthenticationModule"/>
        </httpModules>
    </system.web>
</location>

Чтобы понять это, у вас есть несколько приложений в домене, использующих один и тот же токен проверки подлинности для целей единого входа. Когда у одного приложения истекает токен, вы хотите, чтобы оно обнаруживало его во всех других "открытых" приложениях одновременно.

Так как токен является просто cookie, вы можете настроить непрерывно работающую функцию javascript (скажем, каждые 30 секунд), чтобы обнаруживать наличие форм auth cookie. Если он исчезает (как если бы он выходил из системы / истекал), вы можете использовать скрипт, чтобы выдать предупреждение и т. Д.

Это будет работать независимо от того, сколько окон открыто или какие приложения запущены. Пока существует cookie, вы можете предположить (на стороне клиента), что пользователь прошел аутентификацию.

Другие вопросы по тегам