Desbloquear y autorizar cuentas de usuario (VB)

de Scott Mitchell

Nota:

Desde que se escribió este artículo, los proveedores de pertenencia de ASP.NET han sido reemplazados por ASP.NET Identity. Se recomienda encarecidamente actualizar las aplicaciones para usar la plataforma ASP.NET Identity en lugar de los proveedores de pertenencia destacados en el momento en que se escribió este artículo. ASP.NET Identity tiene una serie de ventajas frente al sistema de pertenencia de ASP.NET, incluidas las siguientes:

  • Mejor rendimiento
  • Extensibilidad y capacidad de prueba mejoradas
  • Compatibilidad con OAuth, OpenID Connect y autenticación en dos fases
  • Compatibilidad con identidades basadas en notificaciones
  • Mejor interoperabilidad con ASP.Net Core

En este tutorial se muestra cómo crear una página web para que los administradores gestionen los estados bloqueados y aprobados de los usuarios. También se verá cómo aprobar solo nuevos usuarios después de haber comprobado su dirección de correo electrónico.

Introducción

Junto con un nombre de usuario, una contraseña y un correo electrónico, cada cuenta de usuario tiene dos campos de estado que dictan si el usuario puede iniciar sesión en el sitio: bloqueado y aprobado. Un usuario se bloquea automáticamente si proporciona credenciales no válidas un número específico de veces en un espacio determinado de minutos (la configuración predeterminada bloquea a un usuario después de cinco intentos de inicio de sesión no válidos en un plazo de diez minutos). El estado aprobado es útil en escenarios en los que alguna acción debe ocurrir antes de que un nuevo usuario pueda iniciar sesión en el sitio. Por ejemplo, es posible que un usuario tenga que comprobar primero la dirección de correo electrónico o que un administrador deba aprobarlo antes de poder iniciar sesión.

Dado que un usuario bloqueado o no aprobado, no puede iniciar sesión, es natural plantearse cómo se pueden restablecer estos estados. ASP.NET no incluye ninguna funcionalidad integrada ni controles web para administrar los estados bloqueados y aprobados de los usuarios, en parte porque estas decisiones deben controlarse de forma local. Algunos sitios pueden aprobar automáticamente todas las cuentas de usuario nuevas (como comportamiento predeterminado). Otros tienen un administrador que aprueba nuevas cuentas o no aprueban a los usuarios hasta que visitan un vínculo enviado a la dirección de correo electrónico proporcionada al registrarse. Del mismo modo, algunos sitios pueden bloquear a los usuarios hasta que un administrador restablezca su estado, mientras que otros sitios envían un correo electrónico al usuario bloqueado con una dirección URL que pueden visitar para desbloquear su cuenta.

En este tutorial se muestra cómo crear una página web para que los administradores gestionen los estados bloqueados y aprobados de los usuarios. También se verá cómo aprobar solo nuevos usuarios después de haber comprobado su dirección de correo electrónico.

Paso 1: Administración de los estados bloqueados y aprobados de los usuarios

En el tutorial Crear una interfaz para seleccionar una cuenta de usuario entre varias cuentas (C#) se ha creado una página que enumera cada cuenta de usuario en una clase GridView paginada y filtrada. En la cuadrícula se enumeran el nombre y el correo electrónico de cada usuario, sus estados aprobados y bloqueados, si están en línea actualmente y cualquier comentario sobre el usuario. Para administrar los estados aprobados y bloqueados de los usuarios, podríamos hacer que esta cuadrícula se pueda editar. Para cambiar el estado aprobado de un usuario, el administrador busca primero su cuenta y luego edita la fila GridView correspondiente, activando o desactivando la casilla aprobada. Como alternativa, se podrían administrar los estados aprobados y bloqueados a través de una página de ASP.NET independiente.

Para este tutorial, se van a usar dos páginas de ASP.NET: ManageUsers.aspx y UserInformation.aspx. La idea aquí es que ManageUsers.aspx enumere las cuentas de usuario del sistema, mientras UserInformation.aspx permite al administrador administrar los estados aprobados y bloqueados de un usuario específico. El primer punto del orden del día es aumentar GridView en ManageUsers.aspx para incluir un HyperLinkField, que se representa como una columna de vínculos. Se busca que cada vínculo apunte a UserInformation.aspx?user=UserName, donde UserName es el nombre del usuario que se va a editar.

Nota:

Si descargó el código del tutorial Recuperar y cambiar las contraseñas (C#), es posible que haya observado que la página ManageUsers.aspx ya contiene un conjunto de vínculos "Administrar" y la página UserInformation.aspx proporciona una interfaz para cambiar la contraseña del usuario seleccionado. Decidí no replicar esa funcionalidad en el código asociado a este tutorial porque funcionó evitando la API de pertenencia y operando directamente con la base de datos de SQL Server para cambiar la contraseña de un usuario. Este tutorial comienza desde cero en la página UserInformation.aspx.

Abra la página ManageUsers.aspx y agregue un HyperLinkField a GridView UserAccounts. Establezca la propiedad Text de HyperLinkField en "Administrar" y sus propiedades DataNavigateUrlFields y DataNavigateUrlFormatString en UserName y "UserInformation.aspx?user={0}", respectivamente. Estas opciones configuran HyperLinkField de modo que todos los hipervínculos muestren el texto "Administrar", pero cada vínculo pasa el valor UserName adecuado a la cadena de consulta.

Después de agregar HyperLinkField a GridView, dedique un momento a ver la página ManageUsers.aspx en un explorador. Como se muestra en la Figura 1, cada fila GridView ahora incluye un vínculo "Administrar". El vínculo "Administrar" de Bruce apunta a UserInformation.aspx?user=Bruce, mientras que el vínculo "Administrar" para Dave apunta a UserInformation.aspx?user=Dave.

The HyperLinkField Adds a

Figura 1: HyperLinkField agrega un vínculo "Administrar" para cada cuenta de usuario (haga clic para ver la imagen de tamaño completo)

Crearemos la interfaz de usuario y el código de la página UserInformation.aspx en un momento, pero en primer lugar se abordará cómo cambiar mediante programación los estados bloqueados y aprobados de un usuario. La MembershipUser clase tiene IsApprovedpropiedades y IsLockedOut. La propiedad IsLockedOut es de solo lectura. No hay ningún mecanismo para bloquear mediante programación a un usuario; para desbloquearlo, use el UnlockUser método de la clase MembershipUser. La propiedad IsApproved es legible y editable. Para guardar los cambios de esta propiedad, es necesario llamar al UpdateUser método de la claseMembership, pasando el objeto modificadoMembershipUser.

Dado que la propiedad IsApproved es legible y editable, es probable que un control CheckBox sea el mejor elemento de la interfaz de usuario para configurarla. Pero un CheckBox no funcionará con la propiedad IsLockedOut porque un administrador no puede bloquear a un usuario, puede que solo lo desbloquee. Una interfaz de usuario adecuada para la propiedad IsLockedOut es un botón que, cuando se hace clic, desbloquea la cuenta de usuario. Este botón solo se debe habilitar si el usuario está bloqueado.

Creación de la página UserInformation.aspx

Ahora está todo listo para implementar la interfaz de usuario en UserInformation.aspx. Abra esta página y agregue los siguientes controles web:

  • Un control HyperLink que, al hacer clic, devuelve el administrador a la página ManageUsers.aspx.
  • Una etiqueta de control web para mostrar el nombre del usuario seleccionado. Establezca ID de la etiqueta en UserNameLabel y borre la propiedad Text.
  • Un control CheckBox denominado IsApproved. Establezca su propiedad AutoPostBack en True.
  • Un control de etiqueta para mostrar la última fecha bloqueada del usuario. Asigne el nombre LastLockedOutDateLabel a esta etiqueta y desactive su propiedad Text.
  • Un botón para desbloquear al usuario. Asigne a este botón el nombre UnlockUserButton y establezca la propiedad Text en "Desbloquear usuario".
  • Un control de etiqueta que muestra mensajes de estado, como "Se ha actualizado el estado aprobado por el usuario". Asigne el nombre StatusMessage a este control, borre su propiedad Text y establezca su propiedad CssClass en Important. (La clase CSS Important se define en el archivo de hoja de estilos Styles.css; muestra el texto correspondiente en una fuente grande y roja).

Después de agregar estos controles, la vista Diseño de Visual Studio debe tener un aspecto similar a la captura de pantalla de la Figura 2.

Create the User Interface for UserInformation.aspx

Figura 2: Cree la interfaz de usuario para UserInformation.aspx (haga clic para ver la imagen de tamaño completo)

Una vez completada la interfaz de usuario, nuestra siguiente tarea consiste en establecer CheckBox IsApproved y otros controles en función de la información del usuario seleccionado. Cree un controlador de eventos para el evento Load de la página y agregue el código siguiente:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
     If Not Page.IsPostBack Then
          ' If querystring value is missing, send the user to ManageUsers.aspx
          Dim userName As String = Request.QueryString("user")
          If String.IsNullOrEmpty(userName) Then
               Response.Redirect("ManageUsers.aspx")
          End If

          ' Get information about this user
          Dim usr As MembershipUser = Membership.GetUser(userName)
          If usr Is Nothing Then
               Response.Redirect("ManageUsers.aspx")

          End If

          UserNameLabel.Text = usr.UserName
          IsApproved.Checked = usr.IsApproved

          If usr.LastLockoutDate.Year < 2000 Then
               LastLockoutDateLabel.Text = String.Empty
          Else
               LastLockoutDateLabel.Text = usr.LastLockoutDate.ToShortDateString()
               UnlockUserButton.Enabled = usr.IsLockedOut
          End If
     End If
End Sub

El código anterior comienza asegurándose de que esta es la primera visita a la página y no una postback posterior. Después lee el nombre de usuario pasado por el campo querystring user y recupera información sobre esa cuenta de usuario a través del método Membership.GetUser(username). Si no se proporcionó ningún nombre de usuario a través de la cadena de consultas o si no se encontró el usuario especificado, el administrador se devuelve a la página ManageUsers.aspx.

Luego el valor UserName del objeto MembershipUser se muestra en UserNameLabel y la CheckBox IsApproved se comprueba en función del valor de la propiedad IsApproved.

La LastLockoutDatepropiedad del objeto MembershipUser devuelve un valor DateTime que indica cuándo se bloqueó por última vez el usuario. Si el usuario nunca se ha bloqueado, el valor devuelto depende del proveedor de pertenencia. Cuando se crea una nueva cuenta, SqlMembershipProvider establece el campoLastLockoutDatede la tabla aspnet_Membership en 1754-01-01 12:00:00 AM. El código anterior muestra una cadena vacía en LastLockoutDateLabel si la propiedad LastLockoutDate se produce antes del año 2000; de lo contrario, la parte de fecha de la propiedad LastLockoutDate se muestra en la etiqueta. La propiedad Enabled de UnlockUserButton se establece en el estado bloqueado del usuario, lo que significa que este botón solo se habilitará si está bloqueado.

Dedique un momento a probar esta página UserInformation.aspx con un explorador. Por supuesto, tendrá que empezar por ManageUsers.aspx y seleccionar una cuenta de usuario para administrarla. Al llegar a UserInformation.aspx, tenga en cuenta que CheckBox IsApproved solo se comprueba si el usuario está aprobado. Si el usuario alguna vez se ha bloqueado, se muestra su última fecha de bloqueo. El botón Desbloquear usuario solo está habilitado si el usuario está bloqueado en ese momento. Al activar o desactivar el CheckBox IsApproved o al hacer clic en el botón Desbloquear usuario, se produce una postback, pero no se hacen modificaciones en la cuenta de usuario porque todavía hay que crear controladores de eventos para estos eventos.

Vuelva a Visual Studio y cree controladores de eventos para el evento IsApproved de la CheckBox CheckedChanged y el evento Click del botón UnlockUser. En el controlador de eventos CheckedChanged establezca la propiedad IsApproved del usuario en la propiedad Checked de CheckBox y guarde los cambios a través de una llamada a Membership.UpdateUser. En el controlador de eventos Click, simplemente llame al método UnlockUser del objeto MembershipUser. En los dos controladores de eventos, muestre un mensaje adecuado en la etiqueta StatusMessage.

Protected Sub IsApproved_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles IsApproved.CheckedChanged
     'Toggle the user's approved status
     Dim userName As String = Request.QueryString("user")
     Dim usr As MembershipUser = Membership.GetUser(userName)
     usr.IsApproved = IsApproved.Checked
     Membership.UpdateUser(usr)

     StatusMessage.Text = "The user's approved status has been updated."

End Sub

Protected Sub UnlockUserButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles UnlockUserButton.Click
     'Unlock the user account
     Dim userName As String = Request.QueryString("user")
     Dim usr As MembershipUser = Membership.GetUser(userName)
     usr.UnlockUser()
     UnlockUserButton.Enabled = False

     StatusMessage.Text = "The user account has been unlocked."
End Sub

Prueba de la página UserInformation.aspx

Con estos controladores de eventos implementados, vuelva a consultar la página y no apruebe a un usuario. Como se muestra en la Figura 3, debería ver un breve mensaje en la página que indica que la propiedad del usuario IsApproved se modificó correctamente.

Chris has been Unapproved

Figura 3: Chris no ha sido aprobado (haga clic para ver la imagen en tamaño completo)

Después cierre sesión e intente iniciar sesión como el usuario cuya cuenta acaba de no aprobarse. Dado que el usuario no está aprobado, no puede iniciar sesión. De forma predeterminada, el control Login muestra el mismo mensaje si el usuario no puede iniciar sesión, independientemente del motivo. Pero en el tutorial Validar las credenciales de usuario en el almacén de usuarios de pertenencia (C#) se ha abordado mejorar el control de inicio de sesión para mostrar un mensaje más adecuado. Como se muestra en la Figura 4, Chris ve un mensaje que explica que no puede iniciar sesión porque su cuenta aún no está aprobada.

Chris Cannot Login Because His Account is Unapproved

Figura 4: Chris no puede iniciar sesión porque su cuenta no está aprobada (haga clic para ver la imagen en tamaño completo)

Para probar la funcionalidad bloqueada, intente iniciar sesión como usuario aprobado, pero use una contraseña incorrecta. Repita este proceso el número de veces necesario hasta bloquear la cuenta del usuario. El control de inicio de sesión también se actualizó para mostrar un mensaje personalizado si se intenta iniciar sesión desde una cuenta bloqueada. Sabe que una cuenta se ha bloqueado una vez que empiece a ver el siguiente mensaje en la página de inicio de sesión: «Su cuenta se ha bloqueado debido a demasiados intentos de inicio de sesión no válidos. Póngase en contacto con el administrador para desbloquear la cuenta.»

Vuelva a la página ManageUsers.aspx y haga clic en el vínculo Administrar del usuario bloqueado. Como se muestra en la Figura 5, debería ver el valor LastLockedOutDateLabel, si el botón Desbloquear usuario está habilitado. Haga clic en el botón Desbloquear usuario para desbloquear la cuenta de usuario. Una vez que haya desbloqueado al usuario, podrá iniciar sesión de nuevo.

Dave Has Been Locked Out of the System

Figura 5: Dave ha estado bloqueado fuera del sistema (haga clic para ver la imagen en tamaño completo)

Paso 2: Especificación del estado aprobado de los nuevos usuarios

El estado aprobado es útil en escenarios en los que quiere que se ejecute alguna acción antes de que un nuevo usuario pueda iniciar sesión y acceder a las características específicas del usuario del sitio. Por ejemplo, puede ejecutar un sitio web privado en el que todas las páginas, excepto las páginas de inicio de sesión y registro, solo son accesibles para los usuarios autenticados. Pero, ¿qué ocurre si un extraño llega al sitio web, busca la página de suscripción y crea una cuenta? Para evitar que esto suceda, podría mover la página de registro a una carpeta Administration y requerir que un administrador cree manualmente cada cuenta. Como alternativa, podría permitir que cualquier usuario se registre, pero prohibir el acceso al sitio hasta que un administrador apruebe la cuenta de usuario.

De forma predeterminada, el control CreateUserWizard aprueba las nuevas cuentas. Puede configurar este comportamiento mediante la DisableCreatedUser propiedad del control. Establezca esta propiedad en True para no aprobar nuevas cuentas de usuario.

Nota:

De forma predeterminada, el control CreateUserWizard inicia sesión automáticamente en la nueva cuenta de usuario. Este comportamiento lo dicta la LoginCreatedUserpropiedad del control. Dado que los usuarios no aprobados no pueden iniciar sesión en el sitio, cuando DisableCreatedUser es True, la nueva cuenta de usuario no ha iniciado sesión, independientemente del valor de la propiedad LoginCreatedUser.

Si va a crear nuevas cuentas de usuario mediante programación a través del método Membership.CreateUser, para crear una cuenta de usuario no aprobada, use una de las sobrecargas que aceptan el valor de propiedad IsApproved del nuevo usuario como parámetro de entrada.

Paso 3: Aprobación de usuarios comprobando su dirección de correo electrónico

Muchos sitios web que admiten cuentas de usuario no aprueban nuevos usuarios hasta que comprueben la dirección de correo electrónico proporcionada al registrarse. Este proceso de comprobación se usa normalmente para frustrar bots, spammers y otros indolentes, ya que requiere una dirección de correo electrónico única y verificada y agrega un paso adicional en el proceso de registro. Con este modelo, cuando un nuevo usuario se suscribe, recibe un mensaje de correo electrónico que incluye un vínculo a una página de comprobación. Al visitar el vínculo, el usuario ha demostrado que recibió el correo y, por lo tanto, que la dirección de correo electrónico proporcionada es válida. La página de comprobación es responsable de aprobar al usuario. Esto puede ocurrir automáticamente, aprobando así a cualquier usuario que llegue a esta página, o solo después de que el usuario proporcione información adicional, como un CAPTCHA.

Para dar cabida a este flujo de trabajo, primero es necesario actualizar la página de creación de la cuenta para no aprobar a los nuevos usuarios. Abra la página EnhancedCreateUserWizard.aspx en la carpeta Membership y establezca la propiedad True del control CreateUserWizard en DisableCreatedUser.

Después es necesario configurar el control CreateUserWizard para enviar un correo electrónico al nuevo usuario con instrucciones sobre cómo comprobar la cuenta. En concreto, incluiremos un vínculo en el correo electrónico a la página Verification.aspx (que aún no hemos creado), pasando la UserId del nuevo usuario a través de la cadena de consulta. La página Verification.aspx buscará el usuario especificado y los marcará aprobados.

Envío de un correo electrónico de comprobación a nuevos usuarios

Para enviar un correo electrónico desde el control CreateUserWizard, configure su propiedad MailDefinition correctamente. Como se explicó en el tutorial anterior, los controles ChangePassword y PasswordRecovery incluyen una MailDefinition propiedad que funciona de la misma manera que el control CreateUserWizard.

Nota:

Para usar la propiedad MailDefinition que necesita para especificar las opciones de entrega de correo en Web.config. Para obtener más información, consulte Envío de correo electrónico en ASP.NET.

Empiece por crear una nueva plantilla de correo electrónico denominada CreateUserWizard.txt en la carpeta EmailTemplates. Use el texto siguiente en la plantilla:

Hello <%UserName%>! Welcome aboard.

Your new account is almost ready, but before you can login you must first visit:
<%VerificationUrl%>

Once you have visited the verification URL you will be redirected to the login page.

If you have any problems or questions, please reply to this email.

Thanks!

Establezca la propiedad BodyFileName de MailDefinition en "~/EmailTemplates/CreateUserWizard.txt" y su propiedad Subject en «Le damos la bienvenida a mi sitio web. Active la cuenta.»

Tenga en cuenta que la plantilla de correo electrónico CreateUserWizard.txt incluye un marcador de posición <%VerificationUrl%>. Aquí es donde se pondrá la dirección URL de la página Verification.aspx. CreateUserWizard reemplaza automáticamente los marcadores de posición <%UserName%> y <%Password%> por el nombre de usuario y la contraseña de la nueva cuenta, pero no hay ningún marcador de posición integrado <%VerificationUrl%>. Es necesario reemplazarlo manualmente por la dirección URL de comprobación adecuada.

Para ello, cree un controlador de eventos para el SendingMail evento de CreateUserWizard y agregue el código siguiente:

Protected Sub NewUserWizard_SendingMail(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.MailMessageEventArgs) Handles NewUserWizard.SendingMail
     'Get the UserId of the just-added user
     Dim newUser As MembershipUser = Membership.GetUser(NewUserWizard.UserName)
     Dim newUserId As Guid = CType(newUser.ProviderUserKey, Guid)

     ' Determine the full verification URL (i.e., http://yoursite.com/Verification.aspx?ID=...)
     Dim urlBase As String = Request.Url.GetLeftPart(UriPartial.Authority) & Request.ApplicationPath
     Dim verifyUrl As String = "/Verification.aspx?ID=" + newUserId.ToString()
     Dim fullUrl As String = urlBase & verifyUrl

     ' Replace <%VerificationUrl%> with the appropriate URL and querystring

     e.Message.Body = e.Message.Body.Replace("<%VerificationUrl%>", fullUrl)
End Sub

El evento SendingMail se desencadena después del evento CreatedUser, lo que significa que en el momento en el que el controlador de eventos anterior ejecuta, la nueva cuenta de usuario ya se ha creado. Podemos acceder al valor UserId del nuevo usuario llamando al método Membership.GetUser y pasando el UserName introducido en el control CreateUserWizard. Luego se forma la dirección URL de comprobación. La instrucción Request.Url.GetLeftPart(UriPartial.Authority) devuelve la parte http://yourserver.com de la dirección URL; Request.ApplicationPath devuelve la ruta de acceso donde se basa la aplicación. Después la dirección URL de comprobación se define como Verification.aspx?ID=userId. Estas dos cadenas se concatenan para formar la dirección URL completa. Por último, el cuerpo del mensaje de correo electrónico (e.Message.Body) tiene todas las apariciones de <%VerificationUrl%> reemplazadas por la dirección URL completa.

El efecto final es que los nuevos usuarios no están aprobados, lo que significa que no pueden iniciar sesión en el sitio. Además, reciben automáticamente un correo electrónico con un vínculo a la dirección URL de comprobación (consulte la Figura 6).

The New User Receives an Email with a Link to the Verification URL

Figura 6: El nuevo usuario recibe un correo electrónico con un vínculo a la dirección URL de comprobación (haga clic para ver la imagen en tamaño completo)

Nota:

El paso CreateUserWizard predeterminado del control CreateUserWizard muestra un mensaje que informa al usuario de su cuenta y muestra un botón Continuar. Al hacer clic en él, se dirige al usuario a la dirección URL especificada por la propiedad ContinueDestinationPageUrl del control. CreateUserWizard en EnhancedCreateUserWizard.aspx está configurado para enviar nuevos usuarios a ~/Membership/AdditionalUserInfo.aspx, que solicita al usuario su ciudad natal, la dirección URL de la página principal y la firma. Dado que solo los usuarios que han iniciado sesión pueden agregar esta información, tiene sentido actualizar esta propiedad para devolver usuarios a la página principal del sitio (~/Default.aspx). Además, la página EnhancedCreateUserWizard.aspx o el paso CreateUserWizard debe aumentarse para informar al usuario de que se le ha enviado un correo electrónico de comprobación y su cuenta no se activará hasta que siga las instrucciones de ese correo. Propongo estas modificaciones como ejercicio para el lector.

Creación de la página de comprobación

La tarea final es crear la página Verification.aspx. Agregue esta página a la carpeta raíz, asociándola a la página maestra Site.master. Como hemos hecho con la mayoría de las páginas de contenido anteriores agregadas al sitio, quite el control Content que hace referencia a LoginContent ContentPlaceHolder para que la página de contenido use el contenido predeterminado de la página maestra.

Agregue un control Web Label a la página Verification.aspx, establezca su ID en StatusMessage y borre su propiedad de texto. Luego cree el controlador de eventos Page_Load y agregue el código siguiente:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
     If String.IsNullOrEmpty(Request.QueryString("ID")) Then
          StatusMessage.Text = "The UserId was not included in the querystring..."
     Else
          Dim userId As Guid
          Try
               userId = New Guid(Request.QueryString("ID"))
          Catch
               StatusMessage.Text = "The UserId passed into the querystring is not in the proper format..."

               Exit Sub
          End Try

          Dim usr As MembershipUser = Membership.GetUser(userId)
          If usr Is Nothing Then
               StatusMessage.Text = "User account could not be found..."
          Else
               ' Approve the user
               usr.IsApproved = True
               Membership.UpdateUser(usr)
               StatusMessage.Text = "Your account has been approved. Please <a href=""Login.aspx"">login</a> to the site."

          End If
     End If
End Sub

La mayor parte del código anterior comprueba que el UserId proporcionado a través de la cadena de consulta existe, que es un valor válido Guid y que hace referencia a una cuenta de usuario existente. Si se pasan todas estas comprobaciones, se aprueba la cuenta de usuario. De lo contrario, se muestra un mensaje de estado adecuado.

En la Figura 7 se muestra la página Verification.aspx cuando se visita en un explorador.

The New User's Account is Now Approved

Figura 7: La cuenta del nuevo usuario está aprobada ahora (haga clic para ver la imagen en tamaño completo)

Resumen

Todas las cuentas de usuario de pertenencia tienen dos estados que determinan si el usuario puede iniciar sesión en el sitio: IsLockedOut y IsApproved. Las dos propiedades deben ser True para que el usuario inicie sesión.

El estado bloqueado del usuario se usa como medida de seguridad para reducir la probabilidad de que un hacker se infiltre en un sitio a través de métodos de fuerza bruta. En concreto, un usuario se bloquea si hay un número determinado de intentos de inicio de sesión no válidos dentro de un período de tiempo determinado. Estos límites se pueden configurar a través de la configuración del proveedor de pertenencia en Web.config.

El estado aprobado se usa normalmente para prohibir que los nuevos usuarios inicien sesión hasta que haya ocurrido alguna acción. Quizás el sitio requiere que el administrador apruebe primero las cuentas nuevas o, como vimos en el Paso 3, comprobando su dirección de correo electrónico.

¡Feliz programación!

Acerca del autor

Scott Mitchell, autor de varios libros de ASP/ASP.NET y fundador de 4GuysFromRolla.com, ha estado trabajando con tecnologías web de Microsoft desde 1998. Scott trabaja como consultor independiente, formador y escritor. Su último libro es Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Se puede contactar con Scott en mitchell@4guysfromrolla.com o a través de su blog en http://ScottOnWriting.NET.

Agradecimientos especiales a...

Esta serie de tutoriales fue revisada por muchos revisores de gran ayuda. ¿Le interesaría revisar mis próximos artículos de MSDN? Si es así, escríbame a mitchell@4GuysFromRolla.com