Смешение cookie с методом FormsAuthentication.SetAuthCookie () - PullRequest
39 голосов
/ 09 февраля 2011

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

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

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

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

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

1 Ответ

48 голосов
/ 09 февраля 2011

Тайм-аут параметра, который вы нашли в /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. Каждый раз, когда загружается главная страница, я проверяю 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), куда я помещаю свой пароль и группы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...