Вызовите веб-сервис ASMX в javascript без сброса таймеров аутентификации ASP.NET - PullRequest
2 голосов
/ 23 ноября 2010

Краткий обзор

Пинг обратно в веб-сервис в ajax от клиента поддерживает сеанс пользователя живым, я не хочу, чтобы это происходило.

Более подробное резюме

Для веб-сайта, который мы разрабатываем, нам нужно, чтобы клиент отправил запрос (в js) на веб-сервис (ASMX) на сервере (IIS7.5).Это происходит, чтобы сервер знал, что пользователь все еще находится на сайте и не перешел на другой сайт.

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

Мойпроблема в том, что эхо-запрос останавливает тайм-аут пользователя на сервере с помощью стандартного механизма таймаута аутентификации форм.Не удивительно, поскольку 30-секундный пинг в фоновом режиме поддерживает сессию.Даже несмотря на то, что мы хотим знать, находится ли пользователь на сайте, мы хотим, чтобы механизм тайм-аута проверки подлинности форм был соблюден.

Я подумал, что смогу исправить это, удалив ASP.NET_SessionId и.Файлы cookie ASPXAUTH в запросе XMLHttpRequest, который является пингом сервера, но я не могу понять, как это сделать.

Вот как определяются мой веб-сервис и метод:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class PingWS : WebService
{
    [WebMethod]
    public void SessionActive(string sessionID)
    {
        // does stuff here
    }

ЭтоВот как я это называю в JS (запрос по HTTPS,:

$.ajax({
    type: "POST",
    url: "PingWS.asmx/SessionActive",
    data: 'sessionID=' + aspSessionID + '}',
    beforeSend: function (xhr) {
        xhr.setRequestHeader('Cookie', '');
        xhr.setRequestHeader('Cookie', 'ASP.NET_SessionId=aaa; .ASPXAUTH=bbb;');
    },
    dataType: "json"
});

Я пытался с setRequestHeader, но это просто добавляет к заголовку, а не перезаписывает заголовок, и IIS радигнорируйте этот мусор, который я добавил.

Я думаю, может быть, я должен попытаться сделать это на стороне сервера, кто-то вынуть PingWS.asmx из цикла, чтобы он не оставлял сеанс активным, ноЯ не уверен, как это сделать.

Несмотря на то, что заголовок вопроса сфокусирован на очистке cookie в заголовке, я был бы очень рад, если бы кто-нибудь указал, что я действительноглупо, и на самом деле есть гораздо лучший способ попытаться сделать то, что я делаю.

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

Обновление

Я думаю, что я довольно облажался с точки зрения манипулирования cookie здесьпоскольку файлы cookie .ASPXAUTH и ASP.NETSessionId являются HttpOnly, что означает, что браузер забирает их у вас из рук, вы не можете получить к ним доступ через объект document.cookies.Поэтому я бы сказал, что у меня остается:

  1. Обновление моего веб-метода SessionAlive для отслеживания каждого запроса, чтобы я мог сказать, сколько времени пользователь простаивал на странице и время ожидания в случае необходимости
  2. Как-то пометить страницу .asmx на стороне сервера, чтобы она вышла из обычного потока аутентификации / отслеживания сеанса

Я знаю, как это сделать 1. Поэтому я начну с 2.кажется мне намного чище.

Ответы [ 3 ]

1 голос
/ 24 ноября 2010

Вы можете ограничить куки-файл аутентификации указанным путем:

<authentication mode="Forms">
  <forms path="/admin" />
</authentication>

Таким образом, файл cookie аутентификации будет отправляться только в часть /admin вашего сайта, и если вы поместите веб-службу в корневой каталог, вы можете пропинговать ее с помощью AJAX, не отправляя файл cookie.

Другой вариант - просто разместить этот веб-сервис в отдельном виртуальном каталоге.

0 голосов
/ 24 ноября 2010

Есть ответ со стороны сервера.По сути, вы отключаете скользящие тайм-ауты при проверке подлинности с помощью форм, а затем вручную сами уменьшаете тайм-аут и пропускаете его для проверки связи.

Довольно просто для меня, поскольку каждая страница использует один и тот же корневой Site.Master и все страницы наследуются от одного и того жеБазовый класс.

Подытожим здесь: http://picometric.blogspot.com/2009/04/manual-sliding-expiration.html

0 голосов
/ 24 ноября 2010

Поскольку вы обнаруживаете, что вам не повезло с манипулированием клиентскими cookie-файлами (или манипуляциями с клиентом любого рода). Манипуляции с заголовками могут быть возможны, но вам придется перехватывать трафик очень рано в конвейере. Я даже не знаю, будет ли это возможно в самом сервисе, но диспетчер трафика, такой как Зевс, мог бы это сделать. Я не верю, что можно настроить механизм сеанса таким образом, чтобы игнорировать заданную комбинацию конечной точки и клиентского запроса, и хотя должна быть возможность заменить весь механизм сеанса, который будет недокументированным и чрезвычайно трудоемким, думаю.

Обычно вам нужно манипулировать трафиком, прежде чем он коснется службы, или вы не собираетесь решать эту проблему. Сессия не была разработана, чтобы быть вариантом.

...