Включение пользователя в систему с поддержкой ASP.Net

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

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

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

Как я могу заставить log-in сохранить?

Здесь технические подробности, я экспериментировал со многими вариантами продолжительности.

 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

Веб-конфигурация:

<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

Ответ 1

Я, наконец, понял последний кусочек головоломки. Когда пул приложений моего сервера был переработан (настроен хостинг-провайдером), ключ шифрования 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>

Ответ 2

Думаю, вам лучше использовать метод 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>

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

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

FormsAuthentication.SignOut();

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

Ответ 3

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

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

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

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

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"

.