Предотвратить запрос на управление таймером AJAX от расширения билета FormsAuthentication? - PullRequest
3 голосов
/ 06 июля 2011

У меня есть приложение webforms, которое использует несколько элементов управления ASP.NET AJAX Timer (т.е. опрос).Если пользователь находится на странице с одним из них, у него фактически никогда не будет тайм-аут, так как процесс опроса поддерживает его билет аутентификации.

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

Есть ли другие предложения о том, как запретить элементу управления Timer сохранять действующий билет проверки подлинности форм?

Ответы [ 2 ]

1 голос
/ 30 июля 2011

Делая успехи, в настоящее время это мое решение. Я перешел от установки настраиваемого заголовка в запросах Timer AJAX и проверки этого заголовка в модуле (вы можете увидеть это в истории версий ответов) до простого решения только для модулей. (Шляпа на Как узнать, пришло ли обновление с вопроса о Таймере )

public class SkipAuthTicketRenewalModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.EndRequest += new EventHandler(context_EndRequest);
    }

    void context_EndRequest(object sender, EventArgs e)
    {
        // See if auth cookie was added in response to the timer control update by the FormsAuthModule, 
        // indicating the ticket was renewed.  If it was, remove it so we don't extend the ticket.

        HttpContext ctx = HttpContext.Current;
        string ctrlname = ctx.Request.Params.Get("__EVENTTARGET");

        if (!String.IsNullOrEmpty(ctrlname))
        {
            Page page = ctx.Handler as Page;
            if (page != null)
            {
                Control ctrl = page.FindControl(ctrlname);
                if (ctrl != null && ctrl is Timer)
                {
                    ctx.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
                }
            }
        }
    }
}
1 голос
/ 06 июля 2011

Первый трюк, который приходит ко мне.

в веб-конфигурации, установите домен как www.yoursite.com

<forms domain="www.yoursite.com" .... >

и создайте поддомен, такой как timers.yoursite.com, который на самом деле совпадает с www.yoursite.com. Теперь звоните на times.yoursite.com , и потому что куки должны найти www.yoursite.com, они никогда не запускают аутентификацию.

Второй подвох

Установить в веб-конфигурации requireSSL = true

<forms requireSSL="true" 

и совершайте звонки по таймеру на незащищенной странице. Таким образом, аутентификация не сработает снова, потому что cookie не читается сейчас на незащищенной странице.

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

...