Различия в формах аутентификации и времени ожидания сеанса - PullRequest
26 голосов
/ 01 февраля 2010

Тайм-аут состояния сеанса устанавливается с помощью этого элемента web.config

<sessionState mode="InProc" cookieless="false" timeout="120" />

Аутентификация форм настраивается с помощью этого элемента web.config

<system.web>
  <authentication mode="Forms">
    <forms loginUrl="Login.aspx"
           protection="All"
           timeout="30"
           name=".ASPXAUTH" 
           path="/"
           requireSSL="false"
           slidingExpiration="true"
           defaultUrl="default.aspx"
           cookieless="UseDeviceProfile"
           enableCrossAppRedirects="false" />
  </authentication>
</system.web>

Какая разница между таймаутами, указанными в каждом из этих элементов? Если оба они разные, как это будет работать?

Ответы [ 3 ]

58 голосов
/ 01 февраля 2010

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

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

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

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

1 голос
/ 01 февраля 2010

как и ожидалось.

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

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

0 голосов
/ 21 августа 2012

Значение времени ожидания сеанса должно быть меньше времени ожидания FormsAuthentication. Поскольку сеанс может быть удален по причине, и сценарий не будет работать.

Если время сеанса истекло, проверьте FormsAuthentication Ticket. Если тикет действителен, а время не истекло, сгенерируйте сеанс заново на странице входа в систему (определяется в файле web.config как параметр LoginUrl в настройках FormsAuthentication).

Если время FormsAuthentication истекло, ASP.NET FormsAuthentication автоматически перенаправляет пользователя на страницу входа, и пользователю необходимо снова войти в систему.

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

На самом деле я предпочитаю эту структуру:

  1. Создайте BasePage.cs для страниц входа в систему.
  2. в Page_Init в BasePage.cs проверьте сеанс. Если сессия истекла; перенаправить пользователя на страницу входа.

    if (Session ["UserId"] == null) Response.Redirect ("Login.aspx", true);

  3. При Page_Load в Login.aspx проверьте время сеанса и проверки подлинности FormsAuthentication.

        //User already have a session; redirect user to homepage. 
        if (SessionHandler.UserId != 0)
            Response.Redirect("HomePage.aspx");
        else 
        {
            //Session is killed; check Ticket is Valid or not
            if (Context.User.Identity != null && Context.User.Identity.IsAuthenticated)
            {
                //Use Value of the FormsAuthentication
                var customDataToCheck = Context.User.Identity.Name;
    
                //Use value to check user is exist really and check db for user's session
                var user = CheckUserData(customDataToCheck);
                if (user != null)
                {
                    //Start Session here 
                    SessionHandler.StartSession(user);
    
                    //Redirect user to page what you want. 
                    Response.Redirect("HomePage.aspx?ref=regenerated_session");
                }                    
            }
        }
    
  4. на Login.aspx используйте FormsAuthentication для создания куки.

    if (username == "testuser" && password == "testpassword") { // Данные пользователя будут записаны в файл cookie, сохраните данные пользователя, которые вы можете проверить, является ли пользователь действительным или нет (например, Имя пользователя или Идентификатор пользователя).
    System.Web.Security.FormsAuthentication.SetAuthCookie ("testUserData", keepMeSignedInCheckBox.Checked); Response.Redirect ( "HomePage.aspx"); }

...