2015-11-10 2 views
9

У меня есть сайт относительно простые WebForms основе с помощью проверки подлинности форм:Предотвращение FormsAuthentication истечения времени от увеличения

<authentication mode="Forms"> 
    <forms loginUrl="login.aspx" defaultUrl="secure/home.aspx" name=".AdminSite" /> 
</authentication> 

Как это прямо не упоминается, slidingExpiration устанавливается истина по умолчанию, и, таким образом, пользователь не вошел в систему до тех пор, пока они все еще перемещаются по сайту.

Тем не менее, мне нужна конкретная страница, чтобы не увеличить время истечения срока действия. Возможно ли это, либо в пределах web.config, либо в коде? Единственные предложения, которые я видел, указывают на установку slidingExpiration на false, которая применима по всей ширине.

Куки аутентификации устанавливается с помощью:

FormsAuthentication.RedirectFromLoginPage(username, False) 

и, следовательно, изменения самой аутентификации печенья не практично.

ответ

3

Срок годности сползания достигается модулем FormsAuthentication путем повторного выдачи файла cookie, когда это необходимо. Чтобы предотвратить скольжение, вам необходимо предотвратить обновление печенья.

Это можно сделать, просто удалив FormsAuthentication cookie из ответа.

Ниже приведен код из очень простой веб-формы. На странице aspx есть div, в котором показан вывод из события Page_Load.

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     testDiv.InnerHtml = "Hi, cookie is: " + HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName].Value; 
     testDiv.InnerHtml += "<br />"; 
     var ticket = FormsAuthentication.Decrypt(HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName].Value); 
     testDiv.InnerHtml += "Expires: " + ticket.Expiration.ToString("yyyy-MM-dd HH:mm:ss"); 

     if(Response.Cookies.AllKeys.Contains(FormsAuthentication.FormsCookieName)) 
      testDiv.InnerHtml += "<br />Forms auth is trying to update the cookie in this response"; 

    } 
    protected void Page_Prerender(object sender, EventArgs e) 
    { 
     if (Response.Cookies.AllKeys.Contains(FormsAuthentication.FormsCookieName)) 
      Response.Cookies.Remove(FormsAuthentication.FormsCookieName); 
    } 
} 

Page_Prerender событие удаляет FormsAuthentication печенье из ответа, если он присутствует, тем самым предотвращая скольжение.

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

С FormsAuthentication не обновляет файл cookie, если половина времени истечения не прошла, что происходит, так это то, что в первую минуту страница будет показывать один и тот же зашифрованный файл cookie и то же самое время истекает. Через несколько минут на странице будет сообщено, что FormsAuthentication пытается обновить файл cookie. Но Page_Prerender удаляет файл cookie, чтобы он не отправлялся. Через минуту вы будете перенаправлены на страницу входа.

Тестирование же, но удаление метода Page_Prerender показывает, что файл cookie изменен и время истечения срока действия обновляется примерно через минуту.

+0

Это интересный способ, и довольно компактный - я попробую. –

+0

Хорошо работает и очень прост в реализации. Благодарю. –

0

Вы можете установить дату истечения срока действия cookie ответчика на дату истечения срока действия файла cookie запроса, эффективно перезаписывая, что система делает для этой конкретной страницы.

+0

К сожалению, файл cookie основан на сеансе, а не настойчивый, и в результате не существует истечения срока действия. –

0

После некоторой мысли я отклонился от попытки изменить файл cookie или создать второй файл cookie или переопределить файл cookie, изменив Session.Timeout. Я думаю, что на самом деле проще использовать таймер, используя System.Timers. Методы таймера всегда можно поместить в отдельный класс, если хотите.

using System.Timers; 



public partial class MyPage:Page 
{ 

    private System.Timers.Timer timer; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     SetTimer(); 
    } 
    private void SetTimer() 
    { 
     // Interval is set in milliseconds- set as you please. 
     timer = new System.Timers.Timer(1000 * 60); 

     timer.Elapsed += OnTimedEvent; 
     timer.AutoReset = true; 
     timer.Enabled = true; 
    } 

    // In this handler, stop the timer and call a method to clear all cookies. 
    private void OnTimedEvent(object source, ElapsedEventArgs e) 
    { 
     timer.Stop(); 
     ClearAllCookies(); 
    } 

    // Method to clear all cookies. There may be a simpler way to do this, you are vague about your cookies, so I supplied a clear all. 

    public void ClearAllCookies() 
    { 
     HttpCookie cookie; 
     string cookieName; 
     int cookieCnt = Request.Cookies.Count; 
     for(int i = 0; i < cookieCnt; i++) 
     { 
      cookieName = Request.Cookies[i].Name; 
      cookie = new HttpCookie(cookieName); 
      // This causes the cookie to expire 
      cookie.Expires = DateTime.Now.AddDays(-1); 
      Response.Cookies.Add(cookie); 
     } 

     Response.Redirect("LogIn.aspx"); 
    } 
} 

Редактировать

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

public void ForceLogOff(){ 

    Session.Clear(); 
    Session.Abandon(); 
    Session.RemoveAll(); 

    // Do here whatever you need to do. 
    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie); 

    Response.Redirect("LogIn.aspx"); 
} 

Как вы заканчиваете сеанс, зависит от вас. Это дает вам возможность переопределить проблему с полным сроком действия и установить индивидуальный тайм-аут только с одной страницы.

+0

Я выяснил в вопросе, как настроен cookie аутентификации; он основан на сеансе с нулевым сроком действия, поэтому изменение времени истечения срока действия не будет работать. –

+0

@AdrianWragg Ну тогда создайте метод, который удалит их все .. это решение будет работать. Идея состоит в том, чтобы удалить все файлы cookie и выйти из системы. Это может быть перенаправление на автоматический выход из системы. И таким образом вы не трогаете файлы cookie, если вы не хотите завершить сеанс. –

+0

Я не уверен, почему ваше решение очищает файлы cookie. Ваше решение, похоже, эквивалентно простому настройке 'slideExpiration' на' false', что не является проблемой, которую я пытаюсь решить - мне просто хотелось бы, чтобы одна страница не увеличивала время истечения срока действия при посещении. –

Смежные вопросы