Подтвердить что ты не робот

Путаница Cookie с методом FormsAuthentication.SetAuthCookie()

Таким образом, в StackOverflow есть много сообщений об этом, но я все еще не смог решить мою точную проблему. Здесь суть:

У меня есть веб-сайт, требующий аутентификации. Я использую стандартный метод .NET FormsAuthentication.SetAuthCookie() для сохранения сеанса пользователя.

Мой вопрос таков: в файле web.config имеется атрибут timeout для "/system.web/authentication/forms" node. Если я установил это значение, скажем, 30 минут, это время бездействия пользователя, которое может быть у пользователя до истечения срока их сеанса?

Причина, по которой я спрашиваю, заключается в том, что независимо от того, для чего я установил это значение, если я установил настойчивость в true в SetAuthCookie(), истечение срока действия в наборе файлов cookie составляет 90 минут. Если в SetAuthCookie() задано значение persistence на false, истечение срока действия cookie устанавливается на "конец сеанса".

Что такое фактическое значение атрибута "Тайм-аут", и как я могу получить постоянный файл cookie, который длится месяц или год или дольше?

4b9b3361

Ответ 1

Тайм-аут параметра, который вы нашли в /system.web/authentication/forms, - это тайм-аут (в минутах) от продолжительности проверки подлинности.

Это означает, что после определенного количества времени бездействия пользователю будет предложено снова войти в систему. Если вы попытаетесь проверить этот My.Profile.Current.IsAuthenticated, это будет false.

Вы можете не сохранять файл cookie. В этой ситуации, если ваш билет истекает, ваш файл cookie также истекает. Файл cookie (в случае сохранения) имеет целью запомнить пользователя, если он вернется на ваш сайт.

Возможно, вы захотите сохранить свой файл cookie в течение 10 лет, чтобы пользователю не приходилось снова вводить имя пользователя и пароль, если только они не захотели удалить файл cookie. Файл cookie действителен, даже если браузер закрыт (когда он сохраняется).

Еще одна важная вещь, которую нужно помнить - это параметр slideExpiration:

<authentication mode="Forms">
    <forms loginUrl="~/Partner/LogOn" defaultUrl="~/Home/Index" 
           timeout="30" slidingExpiration="true" />
</authentication>

если это правда, ваш билет на подтверждение будет обновляться каждый раз, когда на вашем сайте будет активность: обновление страницы и т.д.

Что вы можете сделать - и что я сделал - написать свой собственный файл cookie следующим образом:

 FormsAuthenticationTicket authTicket = new
     FormsAuthenticationTicket(1, //version
     userName, // user name
     DateTime.Now,             //creation
     DateTime.Now.AddMinutes(30), //Expiration (you can set it to 1 month
     true,  //Persistent
     userData); // additional informations

Обновление

Я выполнил эту процедуру, потому что хочу сохранить свои группы в зашифрованном файле cookie:

Dim authTicket As System.Web.Security.FormsAuthenticationTicket = _
        New System.Web.Security.FormsAuthenticationTicket( _
            1, _
            UserName, _
            Now, _
            Now.AddYears(100), _
            createPersistentCookie, _
            UserData)

Dim encryptedTicket As String = System.Web.Security.FormsAuthentication.Encrypt(authTicket)

Dim authCookie As HttpCookie = New HttpCookie( _
    System.Web.Security.FormsAuthentication.FormsCookieName, _
    encryptedTicket)

If (createPersistentCookie) Then
    authCookie.Expires = authTicket.Expiration
End If

Response.Cookies.Add(authCookie)

Как вы можете видеть, я установил истечение срока действия файла cookie аутентификации и билета аутентификации с тем же самым таймаутом (только при сохранении).

Еще одна вещь, которую я пробовал, - это сохранить имя пользователя и пароль в зашифрованном файле cookie. Каждый раз, когда загружается главная страница, я проверяю My.Profile.Current.IsAuthenticated, чтобы проверить, действительно ли аутентификация действительна. Если нет, я снова прочитаю cookie, получаю имя пользователя и пароль и проверяю его на БД:

Public Function ReadCookieAuthentication(ByVal Context As System.Web.HttpContext) As Security.CookieAuth

    Dim CookieUserData = New Security.CookieAuth()

    Dim cookieName As String = System.Web.Security.FormsAuthentication.FormsCookieName
    Dim authCookie As HttpCookie = Context.Request.Cookies(cookieName)

    If (Not (authCookie Is Nothing)) Then
        Dim authTicket As System.Web.Security.FormsAuthenticationTicket = Nothing
        Try
            authTicket = System.Web.Security.FormsAuthentication.Decrypt(authCookie.Value)
            If (Not (authTicket Is Nothing)) Then
                If (authTicket.UserData IsNot Nothing) AndAlso Not String.IsNullOrEmpty(authTicket.UserData) Then
                    CookieUserData = New JavaScriptSerializer().Deserialize(Of Security.CookieAuth)(authTicket.UserData.ToString)
                End If
                CookieUserData.UserName = authTicket.Name
            End If
        Catch ex As Exception
            ' Do nothing.
        End Try
    End If

    Return (CookieUserData)

End Function

Security.CookieAuth - это объект, который я создал для возврата имени пользователя и пароля.
CookieUserData - это хранилище (я сохраняю в json-формате), где я помещаю свой пароль и группы.