2011-02-08 4 views
37

Так что в StackOverflow есть много сообщений об этом, но я все еще не смог решить мою точную проблему. Вот суть:Cookie Confusion с FormsAuthentication.SetAuthCookie() Метод

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

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

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

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

ответ

44

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

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

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

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

Еще одна важная вещь, чтобы помнить параметр slidingExpiration:

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

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

Что вы может сделать - и то, что я сделал - это написать свои собственные кук, как это:

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 

Update

Я реализовал эту рутинную, потому что я хочу, чтобы хранить свои группы в зашифрованном печенье:

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, чтобы проверить, действительно ли аутентификация действительна.Если нет, я снова прочитал печенье, получить имя пользователя и пароль, и проверить его на БД:

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-формате), где я помещаю свой пароль и группы.

+1

привет, извините, я знаю, что это был слишком старый, но просто любопытный, зачем хранить его в формате json? пароль и группы. Я очень новичок в mvc, поэтому я все еще пытаюсь понять концепции и лучшие практики в разработке с ним. спасибо! – gdubs

+3

@ gdubs: Да, я знаю. Это немного необычно. Я мог бы выбрать другой формат, но мне нравится JSON. Кроме того, с MVC вы, как правило, используете JSON довольно много, поэтому я принял его как стандарт. – LeftyX

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