Проверьте срок действия билета аутентификации, не влияя на него

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

Я использую Аутентификацию по формам с slideExpiration.

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу понять, как проверить значение без его сброса. Я создал простую страницу - CheckExpiration.aspx - ниже приведен код:

  private class AjaxResponse
  {
     public bool success;
     public string message;
     public string expirationDateTime;
     public string secondsRemaining;
     public string issueDate;
  }

  protected void Page_Load(object sender, EventArgs e)
  {
     AjaxResponse ar = new AjaxResponse();
     JavaScriptSerializer js = new JavaScriptSerializer();

     if (HttpContext.Current.User.Identity.IsAuthenticated)
     {
        FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;
        string expiration = id.Ticket.Expiration.ToString();

        TimeSpan timeRemaining = id.Ticket.Expiration - DateTime.Now;

        ar.success = true;
        ar.expirationDateTime = expiration;
        ar.issueDate = id.Ticket.IssueDate.ToString();
        ar.secondsRemaining = timeRemaining.Minutes.ToString() + ":" + timeRemaining.Seconds.ToString();
     }
     else
     {
        ar.success = false;
        ar.message = "User not authenticated";
     }

     string output = js.Serialize(ar);
     Response.Write(js.Serialize(ar));

  }

Я вызываю эту страницу с главной страницы своего приложения, используя ajax каждую секунду. Меньше точки в середине срока действия аутентификации, срок действия сбрасывается.

Как я могу предотвратить это поведение? Могу ли я что-нибудь сделать в заголовке запроса?

2 ответа

Поместите страницу CheckExpiration.aspx в свое собственное приложение и разверните ее как виртуальный каталог под своим основным приложением. В этом виртуальном каталоге настройте slideExpiration=false. Ваш код будет работать как есть, но не будет восстанавливать тикет, когда он становится меньше половины времени до истечения срока действия.

Вот что я сделал в быстром локальном проекте, чтобы убедиться, что он работает:

  1. Создал новое веб-приложение AuthTest4 и настроил его на использование локального сервера IIS в пути /AuthTest4
  2. Зайдите в IIS и измените настройку Machine Key для /AuthTest4, чтобы снять все опции AutoGenerate/Isolate и сгенерировать свой собственный MachineKey.
  3. Создал пустое веб-приложение ExpCheck и поместил в него свой код CheckExpiration.aspx.
  4. Настроенное веб-приложение ExpCheck для использования локального IIS в виртуальном каталоге /AuthTest4/ExpCheck
  5. Изменен web.config приложения ExpCheck, чтобы иметь только раздел, показанный ниже

ExpCheck web.config. Все остальные параметры безопасности будут каскадно перемещаться из родительского виртуального каталога.

<system.web>
  <authentication mode="Forms">
   <forms slidingExpiration="false" />
  </authentication>
</system.web>

Почему бы вам не сохранить срок действия как переменную сеанса, которую вы вычисляете сами? Вам нужно только один раз получить значение id.Ticket.Expiration. Затем при каждом вызове получайте значение с сервера и увеличивайте его соответствующим образом, а затем сохраняйте обратно на сервере.

http://msdn.microsoft.com/en-us/library/ms178581%28v=vs.85%29.aspx

псевдокод:

if(!Session.KeyExists("Expiration"))
{
  Session["Expiration"] = id.Ticket.Expiration;
}

Session["TimeRemaining"] = Session["Expiration"] - DateTime.Now;

// get all ajaxy here
Другие вопросы по тегам