asp.net - usuario - membership c# ejemplo
Hacer que el inicio de sesiĆ³n del usuario sea persistente con la suscripciĆ³n a.NET (3)
Al leer su código, es posible que haya establecido en cero el valor del tiempo de espera de FormsAuthenticationTicket. La línea en su código donde crea el ticket dice: -
Dim authTicket As FormsAuthenticationTicket = New FormsAuthenticationTicket(Username, True, Expiration.Subtract(Expiration).TotalMinutes)
El valor de Expiration.Subtract(Expiration).TotalMinutes
siempre será "0".
Es posible que sea mejor usar el formato largo para crear el ticket de la siguiente manera, lo que resultaría en menos ambigüedad.
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
También hay un buen artículo de Microsoft KB here en " Descripción del ticket de autenticación de formularios y la cookie "
.
Tengo un sitio web que está construido en ASP.NET 3.5 y SQL Server 2005, usando el proveedor de membresía de SQL, y presumiblemente forma la autenticación.
Dado que las necesidades de seguridad en mi sitio son muy bajas, me gustaría autenticarme una vez y luego mantener el inicio de sesión de forma indefinida (sin dar al usuario la opción).
Lo que sucede es que el usuario inicia sesión, permanece conectado durante la sesión y, luego, la próxima vez que llega, se desconecta.
¿Cómo puedo obtener el inicio de sesión persistido?
Aquí están los detalles técnicos, he experimentado con muchas variaciones de duraciones.
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
Configuración web:
<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>
Editar: Aquí está la información de la cookie que se está almacenando por el cliente:
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
Creo que estaría mejor usando el método FormsAuthentication.SetAuthCookie
lugar de escribir un montón de código usted mismo.
Creo que la configuración de su proveedor de membresía en web.config puede estar en conflicto con la configuración que proporciona en el código, además de que no está proporcionando un nombre de cookie.
Intente lo siguiente:
if (Membership.ValidateUser(userName, password))
{
FormsAuthentication.SetAuthCookie(userName, true); //Creates a cookie named "XXXAuth" - see settings in web.config below
}
Junto con la siguiente configuración en 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>
Simplemente cambie el valor de "tiempo de espera" en el bloque de autenticación para que sea un valor más largo si realmente desea crear un período de inicio de sesión indefinido. Creo 432000 = 5 días.
Si desea que sus usuarios puedan cerrar sesión de manera explícita, simplemente llame al siguiente método en respuesta a un clic de botón (o lo que sea):
FormsAuthentication.SignOut();
Espero que esto ayude.
Finalmente me di cuenta de la última pieza del rompecabezas. Cuando el grupo de aplicaciones de mi servidor estaba siendo reciclado (configurado por el proveedor de alojamiento), la clave de cifrado de viewstate se estaba volviendo a generar automáticamente. Esto significó que, aunque las cookies eran válidas y no caducadas (visita previa a la devolución), cuando el usuario devolvió la información, la codificación había cambiado y la cookie ya no era válida.
La solución fue especificar manualmente una clave de validación estática. El siguiente enlace se puede usar para generar la etiqueta web.config necesaria para esto.
http://www.aspnetresources.com/tools/keycreator.aspx
ACTUALIZAR:
Aquí hay un sitio más configurable para generar clave de máquina
Árbol de origen - Atributo de generación
Me doy cuenta de que esto podría tener un impacto menor en la seguridad. Supongo que, en teoría, es más seguro tener una clave cambiante en caso de que su clave se vea forzada bruscamente y comprometa cualquier dato que pueda estar almacenando en el estado de vista, pero probablemente no debería estar almacenando datos confidenciales. información en el estado de visualización ya que no es inherentemente segura de todos modos.
Ejemplo:
<configuration>
<system.web>
<machineKey
validationKey="97CEB2D3DEBF853649EAB851F56F08BA328423F935C97244CF5300925B6FF7D2C43084C73CBAF19D5193755EF7F87A3FFC714675F9197C822BAEEC97E853B91E"
decryptionKey="A72F69A4650348E3AA249A8179516D67C8553B3D4BD165B9"
validation="SHA1" />
</system.web>
</configuration>