visual usuario tutorial studio que net ejemplo crear asp asp.net asp.net-membership asp.net-3.5 sqlmembershipprovider

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>