16

У меня есть веб-сайт, который построен в ASP.NET 3.5 & SQL Server 2005 с использованием поставщика членства в sql и, предположительно, проверки подлинности.Создание пользовательского входа в систему с ASP .Net. Членство

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

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

Как я могу получить регистрацию?

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

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> 

Edit: Вот информация печенье, которая становится хранится клиентом:

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 

ответ

21

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

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

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

UPDATE:

Вот более настраиваемый сайт для создания Machine Key

Source Tree - Generage attribute

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

Пример:

<configuration> 
    <system.web> 
    <machineKey 
     validationKey="97CEB2D3DEBF853649EAB851F56F08BA328423F935C97244CF5300925B6FF7D2C43084C73CBAF19D5193755EF7F87A3FFC714675F9197C822BAEEC97E853B91E" 
     decryptionKey="A72F69A4650348E3AA249A8179516D67C8553B3D4BD165B9" 
     validation="SHA1" /> 
    </system.web> 
</configuration> 
+4

FYI, обе ссылки теперь мертвы –

2

Чтение кода вы могли случайно установить тайм-аут 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 here на "Понимание форм проверки подлинности билетов и Cookie"

.

+0

@OtisAardvark Хороший глаз, я собирался исправить это, пока я не увидел ответ theDorko, в случае его не работает, я переключиться на этот следующий @theDorko I ранее пробовал этот метод, но я думаю, что мои настройки webconfig были неправильными. Я внесла ваши изменения и отчитаюсь, если это сработает Спасибо! –

19

Я думаю, что вам лучше было бы использовать метод 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(); 

Надеется, что это помогает.

+1

+1 для обозначения значения тайм-аута - потребовалось некоторое время, чтобы найти его тоже, хотя я думаю, что вы должны звонить: FormsAuthentication.SetAuthCookie (имя_пользователя, true); для настройки файла cookie. –

+0

Ах, да. Ответ исправлен :) –

+0

Я реализовал это, к сожалению, это не устранило мою проблему. Кажется, это не имело никакого эффекта. –