Обеспечение постоянного входа пользователя с помощью ASP .Net Membership - PullRequest
18 голосов
/ 25 марта 2009

У меня есть веб-сайт, который встроен в ASP.NET 3.5 и SQL Server 2005 с использованием поставщика членства sql и предположительно формирует аутентификацию.

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

Что происходит, так это то, что пользователь входит в систему, остается в системе для сеанса, а затем при следующем входе он выходит из системы.

Как я могу сохранить вход в систему?

Вот технические детали, я экспериментировал со многими вариациями длительностей.

 Try
            If Membership.ValidateUser(UserName.Text, Password.Text) Then
                Security.UserManager.AuthenticateUser(UserName.Text)

                If FormsAuthentication.GetRedirectUrl(UserName.Text, False) = "/default.aspx" Then
                    Try
                        'Custom Logic'
                    Catch Ex As Exception
                        'Custom Error handling'
                    End Try
                Else
                    FormsAuthentication.RedirectFromLoginPage(UserName.Text, True)
                End If
            End If
        Catch ex As Exception
            RaiseEvent ExceptionThrown(New ApplicationException("An error occurred trying to log the user in after account creation.", ex))
        End Try

Public Shared Sub AuthenticateUser(ByVal Username As String)
    Dim Expiration As DateTime = DateTime.Now.AddMonths(3)

    Dim authTicket As FormsAuthenticationTicket = New FormsAuthenticationTicket(Username, True, Expiration.Subtract(Expiration).TotalMinutes)
    Dim EncryptedTicket As String = FormsAuthentication.Encrypt(authTicket)
    Dim AuthCookie As New HttpCookie(FormsAuthentication.FormsCookieName, EncryptedTicket)
    AuthCookie.Expires = Expiration
    HttpContext.Current.Response.Cookies.Add(AuthCookie)
End Sub

Web Config:

<membership defaultProvider="SqlProvider" userIsOnlineTimeWindow="15">
   <providers>
      <clear />
      <add
         name="SqlProvider"
         type="System.Web.Security.SqlMembershipProvider"
         connectionStringName="GlobalConnString"
         applicationName="/"
         enablePasswordRetrieval="false"
         enablePasswordReset="true"
         requiresQuestionAndAnswer="false"
         requiresUniqueEmail="true"
         passwordFormat="Hashed"
         minRequiredPasswordLength="5"
         minRequiredNonalphanumericCharacters="0"
      />
   </providers>
</membership>


<authentication mode="Forms">
    <forms timeout="1439200" name="SITENAME" loginUrl="/login.aspx" />
</authentication>

Редактировать: вот информация о файлах cookie, которые хранятся клиентом:

Name    ASP.NET_SessionId
Value   r4dz1555f1pdne45n1zrlkmg
Host    SITEADDRESS.com
Path    /
Secure  No
Expires At End Of Session

Name    .ASPXAUTH
Value   648767AC72A60DBA49650A361A2FA446BA992F792055EF5B488CADC95DF495315C1C577F1C8E67E67BD937A7AB6CC5DAED85D8D64E4ED7867FC0FC395F48FED7FB631033CE441DE85223E8B3EBAE616C
Host    www.SITEADDRESS.com
Path    /
Secure  No
Expires Tue, 09 Jun 2009 17:51:31 GMT

Name    ASP.NET_SessionId
Value   gn5pcymhfsnua455yp45wpej
Host    www.SITEADDRESS.com
Path    /
Secure  No
Expires At End Of Session

Name    SITENAME
Value   9610E8515F3DBC088DAC286E1F44311A20CB2BBB57C97F906F49BC878A6C6AC0B9011777402AEA130DCDC521EF4FBB3393DB310083F72EB502AE971183306C24F07F696B3695C67DD73166F1653DF52B
Host    www.SITEADDRESS.com
Path    /
Secure  No
Expires Tue, 20 Dec 2011 06:14:10 GMT

Ответы [ 3 ]

21 голосов
/ 26 июня 2009

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

Решением было вручную указать статический ключ проверки. Следующая ссылка может быть использована для создания необходимого тега web.config для этого.

http://www.aspnetresources.com/tools/keycreator.aspx

UPDATE:

Вот более настраиваемый сайт для генерации ключа машины

Исходное дерево - Атрибут генерации

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

Пример:

<configuration>
  <system.web>
    <machineKey
        validationKey="97CEB2D3DEBF853649EAB851F56F08BA328423F935C97244CF5300925B6FF7D2C43084C73CBAF19D5193755EF7F87A3FFC714675F9197C822BAEEC97E853B91E"
        decryptionKey="A72F69A4650348E3AA249A8179516D67C8553B3D4BD165B9"
        validation="SHA1" />
  </system.web>
</configuration>
19 голосов
/ 26 марта 2009

Я думаю, вам лучше использовать метод FormsAuthentication.SetAuthCookie, чем писать много кода самостоятельно.

Я полагаю, что настройки вашего провайдера членства в файле web.config могут конфликтовать с настройками, указанными вами в коде, плюс вы не указали имя файла cookie.

Попробуйте следующее:

if (Membership.ValidateUser(userName, password))
{
    FormsAuthentication.SetAuthCookie(userName, true); //Creates a cookie named "XXXAuth" - see settings in web.config below
}

В сочетании со следующими настройками в web.config:

<authentication mode="Forms">
    <forms cookieless="UseCookies" loginUrl="~/SignIn.aspx" name="XXXAuth" slidingExpiration="true" timeout="432000"/>
</authentication>


<membership defaultProvider="XXXMembershipProvider">
    <providers>
        <clear />
        <add name="XXXMembershipProvider" type="System.Web.Security.SqlMembershipProvider" applicationName="XXX" connectionStringName="XXX" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="true" minRequiredPasswordLength="5" minRequiredNonalphanumericCharacters="0" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" passwordAttemptWindow="10" passwordStrengthRegularExpression=""/>
    </providers>
</membership>

Просто измените значение «timeout» в блоке аутентификации на более длинное, если вы действительно хотите создать неопределенный период входа в систему. Я считаю, что 432000 = 5 дней.

Если вы хотите, чтобы ваши пользователи имели возможность явного выхода из системы, просто вызовите следующий метод в ответ на нажатие кнопки (или что-то еще):

FormsAuthentication.SignOut();

Надеюсь, это поможет.

2 голосов
/ 26 марта 2009

Читая ваш код, вы могли случайно установить значение времени ожидания FormsAuthenticationTicket на ноль. Строка в вашем коде, где вы создаете билет, гласит: -

Dim authTicket As FormsAuthenticationTicket = New FormsAuthenticationTicket(Username, True, Expiration.Subtract(Expiration).TotalMinutes)

Значение Expiration.Subtract(Expiration).TotalMinutes всегда будет "0".

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

Public Shared Sub AuthenticateUser(ByVal Username As String)
    Dim Expiration As DateTime = DateTime.Now.AddMonths(3)
    Dim userData As String = String.Empty

    Dim authTicket As FormsAuthenticationTicket = _
       New FormsAuthenticationTicket( _
         Username, _
         DateTime.Now, _
         Expiration, _
         true, _
         userData, _
         FormsAuthentication.FormsCookiePath)
    Dim EncryptedTicket As String = FormsAuthentication.Encrypt(authTicket)
    Dim AuthCookie As New HttpCookie(FormsAuthentication.FormsCookieName, EncryptedTicket)
    AuthCookie.Expires = Expiration
    HttpContext.Current.Response.Cookies.Add(AuthCookie)
End Sub

Существует также хорошая статья Microsoft KB здесь на " Общие сведения о билете проверки подлинности с помощью форм и файлах cookie "

.

...