Запретить странице или обработчику обновлять билет FormsAuthentication - PullRequest
2 голосов
/ 22 июля 2011

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

1 голос
/ 13 июля 2012

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

<location path="/MyApp/CompareTicket">
    <system.web>
        <httpModules>
            <remove name="FormsAuthenticationModule"/>
        </httpModules>
    </system.web>
</location>
0 голосов
/ 08 октября 2011

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

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

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

...