Crear una aplicación segura de formularios Web Forms de ASP.NET con registro de usuario, confirmación por correo electrónico y restablecimiento de contraseña (C#)

Por Erik Reitan

En este tutorial se muestra cómo crear una aplicación de ASP.NET Web Forms con el registro de usuario, la confirmación de correo electrónico y el restablecimiento de contraseña mediante el sistema de pertenencia de ASP.NET Identity. Este tutorial se basa en el tutorial de MVC de Rick Anderson.

Introducción

Este tutorial le guía por los pasos necesarios para crear una aplicación ASP.NET Web Forms mediante Visual Studio y ASP.NET 4.5 para crear una aplicación segura de Web Forms con registro de usuario, confirmación de correo electrónico y restablecimiento de contraseña.

Tareas e información del tutorial:

Creación de una aplicación ASP.NET Web Forms

Nota:

Advertencia: debe instalar Visual Studio 2013 Actualización 3 o posterior para completar este tutorial.

  1. Cree un nuevo proyecto (Archivo ->Nuevo proyecto) y seleccione la plantilla aplicación web ASP.NET y la versión más reciente de .NET Framework en el cuadro de diálogo Nuevo proyecto.

  2. En el cuadro de diálogo Nuevo proyecto de ASP.NET, seleccione la plantilla Web Forms. Deje la autenticación predeterminada como Cuentas de usuario individuales. Si desea hospedar la aplicación en Azure, deje activada la casilla Hospedar en la nube.
    A continuación, haga clic en Aceptar para crear el nuevo proyecto.
    New ASP.NET Project dialog box

  3. Habilite la capa de sockets seguros (SSL) para el proyecto. Siga los pasos disponibles en la sección Habilitación de SSL para el proyecto de la serie de tutoriales de Introducción a Web Forms.

  4. Ejecute la aplicación, haga clic en el vínculo Registrar y registre un nuevo usuario. En este momento, la única validación del correo electrónico se basa en el atributo [EmailAddress] para asegurarse de que la dirección de correo electrónico tiene un formato correcto. Modificará el código para agregar confirmación por correo electrónico. Cierre la ventana del explorador.

  5. En el Explorador de servidores de Visual Studio (Ver ->Explorador de servidores), vaya a Data Connections\DefaultConnection\Tables\AspNetUsers, haga clic con el botón derecho y seleccione Abrir definición de tabla.

    En la siguiente imagen se muestra el esquema de la tabla AspNetUsers:

    AspNetUsers table schema

  6. En el Explorador de servidores, haga clic con el botón derecho en la tabla AspNetUsers y seleccione Mostrar datos de tabla.

    AspNetUsers table data
    En este momento no se ha confirmado el correo electrónico del usuario registrado.

  7. Haga clic en la fila y seleccione Eliminar para eliminar el usuario. Agregará este correo electrónico de nuevo en el paso siguiente y enviará un mensaje de confirmación a la dirección de correo electrónico.

Confirmación por correo electrónico

Se recomienda confirmar el correo electrónico durante el registro de un nuevo usuario para comprobar que no suplantan a otra persona (es decir, no se han registrado con el correo electrónico de otra persona). Supongamos que tiene un foro de debate y quiere evitar que "bob@cpandl.com" se registre como "joe@contoso.com". Sin confirmación por correo electrónico, "joe@contoso.com" podría recibir correos electrónicos no deseados de la aplicación. Supongamos que Bob se registró accidentalmente como "bib@cpandl.com" y no se había dado cuenta, no podría utilizar la recuperación de contraseña porque la aplicación no tiene su correo electrónico correcto. La confirmación de correo electrónico solo ofrece una protección limitada frente a los bots y no frente a los emisores de correo no deseado.

Por lo general, querrá impedir que los nuevos usuarios publiquen datos en su sitio web antes de haber sido confirmados por correo electrónico, mensaje de texto SMS u otro mecanismo. En las siguientes secciones, habilitaremos la confirmación por correo electrónico y modificaremos el código para evitar que los usuarios recién registrados inicien sesión hasta que se haya confirmado su correo electrónico. Usará el servicio de correo electrónico SendGrid en este tutorial.

Enlace de SendGrid

SendGrid ha cambiado su API desde que se escribió este tutorial. Para obtener instrucciones actuales de SendGrid, consulte SendGrid o Habilitación de la confirmación de la cuenta y la recuperación de contraseñas.

Aunque en este tutorial solo se muestra cómo agregar notificaciones por correo electrónico a través de SendGrid, puede enviar correo electrónico mediante SMTP y otros mecanismos (consulte recursos adicionales).

  1. En Visual Studio, abra la Consola del administrador de paquetes (Herramientas ->Administrador de paquetes NuGet ->Cnsola del administrador de paquetes), y escriba el siguiente comando:
    Install-Package SendGrid

  2. Vaya a la página de registro de Azure SendGrid y regístrese para obtener una cuenta gratuita de SendGrid. También puede registrarse para obtener una cuenta gratuita de SendGrid directamente en el sitio de SendGrid.

  3. Desde Explorador de soluciones abra el archivo IdentityConfig.cs en la carpeta App_Start y agregue el siguiente código resaltado en amarillo a la clase EmailService para configurar SendGrid:

    public class EmailService : IIdentityMessageService
    {
       public async Task SendAsync(IdentityMessage message)
       {
         await configSendGridasync(message);
       }
    
       // Use NuGet to install SendGrid (Basic C# client lib) 
       private async Task configSendGridasync(IdentityMessage message)
       {
          var myMessage = new SendGridMessage();
          myMessage.AddTo(message.Destination);
          myMessage.From = new System.Net.Mail.MailAddress(
                              "Royce@contoso.com", "Royce Sellars (Contoso Admin)");
          myMessage.Subject = message.Subject;
          myMessage.Text = message.Body;
          myMessage.Html = message.Body;
    
          var credentials = new NetworkCredential(
                     ConfigurationManager.AppSettings["emailServiceUserName"],
                     ConfigurationManager.AppSettings["emailServicePassword"]
                     );
    
          // Create a Web transport for sending email.
          var transportWeb = new Web(credentials);
    
          // Send the email.
          if (transportWeb != null)
          {
             await transportWeb.DeliverAsync(myMessage);
          }
          else
          {
             Trace.TraceError("Failed to create Web transport.");
             await Task.FromResult(0);
          }
       }
    }
    
  4. Además, agregue las siguientes instrucciones using al principio del archivo IdentityConfig.cs:

    using SendGrid;
    using System.Net;
    using System.Configuration;
    using System.Diagnostics;
    
  5. Para simplificar este ejemplo, almacenará los valores de la cuenta de servicio de correo electrónico en la sección appSettings del archivo web.config. Agregue el siguiente XML resaltado en amarillo al archivo web.config en la raíz del proyecto:

    </connectionStrings>
       <appSettings>
          <add key="emailServiceUserName" value="[EmailServiceAccountUserName]" />
          <add key="emailServicePassword" value="[EmailServiceAccountPassword]" />
       </appSettings>
      <system.web>
    

    Advertencia

    Seguridad: nunca almacene datos confidenciales en el código fuente. En este ejemplo, la cuenta y las credenciales se almacenan en la sección appSetting del archivo Web.config. En Azure, puede almacenar estos valores de forma segura en la pestaña Configurar de Azure Portal. Para obtener información relacionada, consulte el tema de Rick Anderson titulado Procedimientos recomendados para implementar contraseñas y otros datos confidenciales en ASP.NET y Azure.

  6. Agregue los valores del servicio de correo electrónico para reflejar los valores de autenticación de SendGrid (nombre de usuario y contraseña) para que pueda enviar correo electrónico correctamente desde la aplicación. Asegúrese de usar el nombre de la cuenta de SendGrid en lugar de la dirección de correo electrónico que proporcionó SendGrid.

Habilitación de la confirmación de correo electrónico

Para habilitar la confirmación de correo electrónico, modificará el código de registro mediante los siguientes pasos.

  1. En la carpeta Cuenta, abra el código subyacente Register.aspx.cs y actualice el método CreateUser_Click para habilitar los siguientes cambios resaltados:

    protected void CreateUser_Click(object sender, EventArgs e)
    {
        var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
        var user = new ApplicationUser() { UserName = Email.Text, Email = Email.Text };
        IdentityResult result = manager.Create(user, Password.Text);
        if (result.Succeeded)
        {
            // For more information on how to enable account confirmation and password reset please visit https://go.microsoft.com/fwlink/?LinkID=320771
            string code = manager.GenerateEmailConfirmationToken(user.Id);
            string callbackUrl = IdentityHelper.GetUserConfirmationRedirectUrl(code, user.Id, Request);
            manager.SendEmail(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>.");
    
            IdentityHelper.SignIn(manager, user, isPersistent: false);
            IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response);
        }
        else 
        {
            ErrorMessage.Text = result.Errors.FirstOrDefault();
        }
    }
    
  2. En el Explorador de soluciones, haga clic con el botón derecho en Default.aspx y seleccione Establecer como página de inicio.

  3. Ejecute la aplicación presionando F5. Una vez que se muestre la página, haga clic en el vínculo Registrar para mostrar la página Registrar.

  4. Escriba el correo electrónico y la contraseña y, a continuación, haga clic en el botón Registrar para enviar un mensaje de correo electrónico a través de SendGrid.
    El estado actual del proyecto y el código permitirán al usuario iniciar sesión una vez que complete el formulario de registro, aunque no haya confirmado su cuenta.

  5. Compruebe su cuenta de correo electrónico y haga clic en el vínculo para confirmar el correo electrónico.
    Una vez que envíe el formulario de registro, se iniciará sesión.
    Sample Website - Signed In

Requerimiento de confirmación por correo electrónico antes de iniciar sesión

Aunque ha confirmado la cuenta de correo electrónico, en este momento no tendría que hacer clic en el vínculo incluido en el correo electrónico de verificación para que se inicie sesión. En la siguiente sección, modificará el código que requiere que los nuevos usuarios tengan un correo electrónico confirmado antes de iniciar sesión (autentificarse).

  1. En Explorador de soluciones de Visual Studio, actualice el evento CreateUser_Click en el código subyacente Register.aspx.cs incluido en la carpeta Cuentas con los siguientes cambios resaltados:

    protected void CreateUser_Click(object sender, EventArgs e)
    {
        var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
        var user = new ApplicationUser() { UserName = Email.Text, Email = Email.Text };
        IdentityResult result = manager.Create(user, Password.Text);
        if (result.Succeeded)
        {
            // For more information on how to enable account confirmation and password reset please visit https://go.microsoft.com/fwlink/?LinkID=320771
            string code = manager.GenerateEmailConfirmationToken(user.Id);
            string callbackUrl = IdentityHelper.GetUserConfirmationRedirectUrl(code, user.Id, Request);
            manager.SendEmail(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>.");
    
            if (user.EmailConfirmed)
            {
              IdentityHelper.SignIn(manager, user, isPersistent: false);
              IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response);
            } 
            else
            {
              ErrorMessage.Text = "An email has been sent to your account. Please view the email and confirm your account to complete the registration process.";
            }
        }
        else 
        {
            ErrorMessage.Text = result.Errors.FirstOrDefault();
        }
    }
    
  2. Actualice el método LogIn en el código subyacente Login.aspx.cs con los siguientes cambios resaltados:

    protected void LogIn(object sender, EventArgs e)
    {
        if (IsValid)
        {
            // Validate the user password
            var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
            var signinManager = Context.GetOwinContext().GetUserManager<ApplicationSignInManager>();
    
            // Require the user to have a confirmed email before they can log on.
            var user = manager.FindByName(Email.Text);
            if (user != null)
            {
                if (!user.EmailConfirmed)
                {
                    FailureText.Text = "Invalid login attempt. You must have a confirmed email account.";
                    ErrorMessage.Visible = true;
                }
                else
                {
                    // This doen't count login failures towards account lockout
                    // To enable password failures to trigger lockout, change to shouldLockout: true
                    var result = signinManager.PasswordSignIn(Email.Text, Password.Text, RememberMe.Checked, shouldLockout: false);
    
                    switch (result)
                    {
                        case SignInStatus.Success:
                            IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response);
                            break;
                        case SignInStatus.LockedOut:
                            Response.Redirect("/Account/Lockout");
                            break;
                        case SignInStatus.RequiresVerification:
                            Response.Redirect(String.Format("/Account/TwoFactorAuthenticationSignIn?ReturnUrl={0}&RememberMe={1}",
                                                        Request.QueryString["ReturnUrl"],
                                                        RememberMe.Checked),
                                          true);
                            break;
                        case SignInStatus.Failure:
                        default:
                            FailureText.Text = "Invalid login attempt";
                            ErrorMessage.Visible = true;
                            break;
                    }
                }
            }
        }          
    }
    

Ejecución de la aplicación

Ahora que ha implementado el código para comprobar si se ha confirmado la dirección de correo electrónico de un usuario, puede comprobar la funcionalidad en las páginas Registrar e Iniciar sesión.

  1. Elimine las cuentas de la tabla AspNetUsers que contengan el alias de correo electrónico que quiera probar.
  2. Ejecute la aplicación (F5) y compruebe que no puede registrarse como usuario hasta que haya confirmado su dirección de correo electrónico.
  3. Antes de confirmar la nueva cuenta a través del correo electrónico que acaba de enviar, intente iniciar sesión con la nueva cuenta.
    Verá que no puede iniciar sesión y que debe tener una cuenta de correo electrónico confirmada.
  4. Una vez que confirme la dirección de correo electrónico, inicie sesión en la aplicación.

Recuperación y restablecimiento de contraseñas

  1. En Visual Studio, quite los caracteres de comentario del método Forgot en el código subyacente del Forgot.aspx.cs contenido en la carpeta Cuenta, de modo que el método aparezca de la siguiente manera:

    protected void Forgot(object sender, EventArgs e)
    {
        if (IsValid)
        {
            // Validate the user's email address
            var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
            ApplicationUser user = manager.FindByName(Email.Text);
            if (user == null || !manager.IsEmailConfirmed(user.Id))
            {
                FailureText.Text = "The user either does not exist or is not confirmed.";
                ErrorMessage.Visible = true;
                return;
            }
            // For more information on how to enable account confirmation and password reset please visit https://go.microsoft.com/fwlink/?LinkID=320771
            // Send email with the code and the redirect to reset password page
            string code = manager.GeneratePasswordResetToken(user.Id);
            string callbackUrl = IdentityHelper.GetResetPasswordRedirectUrl(code, Request);
            manager.SendEmail(user.Id, "Reset Password", "Please reset your password by clicking <a href=\"" + callbackUrl + "\">here</a>.");
            loginForm.Visible = false;
            DisplayEmail.Visible = true;
        }
    }
    
  2. Abra la página Login.aspx. Reemplace el marcado cerca del final de la sección loginForm como se resalta a continuación:

    <%@ Page Title="Log in" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Login.aspx.cs" Inherits="WebForms002.Account.Login" Async="true" %>
    
    <%@ Register Src="~/Account/OpenAuthProviders.ascx" TagPrefix="uc" TagName="OpenAuthProviders" %>
    
    <asp:Content runat="server" ID="BodyContent" ContentPlaceHolderID="MainContent">
        <h2><%: Title %>.</h2>
    
        <div class="row">
            <div class="col-md-8">
                <section id="loginForm">
                    <div class="form-horizontal">
                        <h4>Use a local account to log in.</h4>
                        <hr />
                        <asp:PlaceHolder runat="server" ID="ErrorMessage" Visible="false">
                            <p class="text-danger">
                                <asp:Literal runat="server" ID="FailureText" />
                            </p>
                        </asp:PlaceHolder>
                        <div class="form-group">
                            <asp:Label runat="server" AssociatedControlID="Email" CssClass="col-md-2 control-label">Email</asp:Label>
                            <div class="col-md-10">
                                <asp:TextBox runat="server" ID="Email" CssClass="form-control" TextMode="Email" />
                                <asp:RequiredFieldValidator runat="server" ControlToValidate="Email"
                                    CssClass="text-danger" ErrorMessage="The email field is required." />
                            </div>
                        </div>
                        <div class="form-group">
                            <asp:Label runat="server" AssociatedControlID="Password" CssClass="col-md-2 control-label">Password</asp:Label>
                            <div class="col-md-10">
                                <asp:TextBox runat="server" ID="Password" TextMode="Password" CssClass="form-control" />
                                <asp:RequiredFieldValidator runat="server" ControlToValidate="Password" CssClass="text-danger" ErrorMessage="The password field is required." />
                            </div>
                        </div>
                        <div class="form-group">
                            <div class="col-md-offset-2 col-md-10">
                                <div class="checkbox">
                                    <asp:CheckBox runat="server" ID="RememberMe" />
                                    <asp:Label runat="server" AssociatedControlID="RememberMe">Remember me?</asp:Label>
                                </div>
                            </div>
                        </div>
                        <div class="form-group">
                            <div class="col-md-offset-2 col-md-10">
                                <asp:Button runat="server" OnClick="LogIn" Text="Log in" CssClass="btn btn-default" />
                            </div>
                        </div>
                    </div>
                    <p>
                        <asp:HyperLink runat="server" ID="RegisterHyperLink" ViewStateMode="Disabled">Register as a new user</asp:HyperLink>
                    </p>
                    <p>
                        <%-- Enable this once you have account confirmation enabled for password reset functionality --%>
                        <asp:HyperLink runat="server" ID="ForgotPasswordHyperLink" ViewStateMode="Disabled">Forgot your password?</asp:HyperLink>
                    </p>
                </section>
            </div>
    
            <div class="col-md-4">
                <section id="socialLoginForm">
                    <uc:OpenAuthProviders runat="server" ID="OpenAuthLogin" />
                </section>
            </div>
        </div>
    </asp:Content>
    
  3. Abra el código subyacente Login.aspx.cs y quite la marca de comentario de la siguiente línea de código resaltada en amarillo del controlador de eventos Page_Load:

    protected void Page_Load(object sender, EventArgs e)
    {
        RegisterHyperLink.NavigateUrl = "Register";
        // Enable this once you have account confirmation enabled for password reset functionality
        ForgotPasswordHyperLink.NavigateUrl = "Forgot";
        OpenAuthLogin.ReturnUrl = Request.QueryString["ReturnUrl"];
        var returnUrl = HttpUtility.UrlEncode(Request.QueryString["ReturnUrl"]);
        if (!String.IsNullOrEmpty(returnUrl))
        {
            RegisterHyperLink.NavigateUrl += "?ReturnUrl=" + returnUrl;
        }
    }
    
  4. Ejecute la aplicación presionando F5. Una vez que se muestre la página, haga clic en el vínculo Iniciar sesión.

  5. Haga clic en el vínculo ¿Ha olvidado su contraseña? para mostrar la página Contraseña olvidada.

  6. Escriba su dirección de correo electrónico y haga clic en el botón Enviar para enviar un correo electrónico a su dirección, lo que le permitirá restablecer la contraseña.
    Compruebe su cuenta de correo electrónico y haga clic en el vínculo para mostrar la página Restablecer contraseña.

  7. En la página Restablecer contraseña, escriba el correo electrónico, la contraseña y la contraseña confirmada. A continuación, presione el botón Restablecer.
    Cuando restablezca correctamente la contraseña, se mostrará la página Contraseña cambiada. Ahora puede iniciar sesión con la nueva contraseña.

Una vez que un usuario crea una nueva cuenta local, se les envía por correo electrónico un vínculo de confirmación que deben usar para poder iniciar sesión. Si el usuario elimina accidentalmente el correo electrónico de confirmación o el correo electrónico nunca llega, necesitará el vínculo de confirmación enviado de nuevo. Los siguientes cambios de código muestran cómo habilitar esto.

  1. En Visual Studio, abra el código subyacente Login.aspx.cs y agregue el siguiente controlador de eventos después del controlador de eventos LogIn:

    protected void SendEmailConfirmationToken(object sender, EventArgs e)
    {
        var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
        var user = manager.FindByName(Email.Text);
        if (user != null)
        {
            if (!user.EmailConfirmed)
            {
                string code = manager.GenerateEmailConfirmationToken(user.Id);
                string callbackUrl = IdentityHelper.GetUserConfirmationRedirectUrl(code, user.Id, Request);
                manager.SendEmail(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>.");
    
                FailureText.Text = "Confirmation email sent. Please view the email and confirm your account.";
                ErrorMessage.Visible = true;
                ResendConfirm.Visible = false;
            }
        }
    }
    
  2. Modifique el controlador de eventos LogIn en el código subyacente Login.aspx.cs cambiando el código resaltado en amarillo de la siguiente manera:

    protected void LogIn(object sender, EventArgs e)
    {
        if (IsValid)
        {
            // Validate the user password
            var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
            var signinManager = Context.GetOwinContext().GetUserManager<ApplicationSignInManager>();
    
            // Require the user to have a confirmed email before they can log on.
            var user = manager.FindByName(Email.Text);
            if (user != null)
            {
                if (!user.EmailConfirmed)
                {
                    FailureText.Text = "Invalid login attempt. You must have a confirmed email address. Enter your email and password, then press 'Resend Confirmation'.";
                    ErrorMessage.Visible = true;
                    ResendConfirm.Visible = true;
                }
                else
                {
                    // This doen't count login failures towards account lockout
                    // To enable password failures to trigger lockout, change to shouldLockout: true
                    var result = signinManager.PasswordSignIn(Email.Text, Password.Text, RememberMe.Checked, shouldLockout: false);
    
                    switch (result)
                    {
                        case SignInStatus.Success:
                            IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response);
                            break;
                        case SignInStatus.LockedOut:
                            Response.Redirect("/Account/Lockout");
                            break;
                        case SignInStatus.RequiresVerification:
                            Response.Redirect(String.Format("/Account/TwoFactorAuthenticationSignIn?ReturnUrl={0}&RememberMe={1}",
                                                        Request.QueryString["ReturnUrl"],
                                                        RememberMe.Checked),
                                          true);
                            break;
                        case SignInStatus.Failure:
                        default:
                            FailureText.Text = "Invalid login attempt";
                            ErrorMessage.Visible = true;
                            break;
                    }
                }
            }
        }
    }
    
  3. Actualice la página Login.aspx agregando el código resaltado en amarillo de la siguiente manera:

    <%@ Page Title="Log in" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Login.aspx.cs" Inherits="WebForms002.Account.Login" Async="true" %>
    
    <%@ Register Src="~/Account/OpenAuthProviders.ascx" TagPrefix="uc" TagName="OpenAuthProviders" %>
    
    <asp:Content runat="server" ID="BodyContent" ContentPlaceHolderID="MainContent">
        <h2><%: Title %>.</h2>
    
        <div class="row">
            <div class="col-md-8">
                <section id="loginForm">
                    <div class="form-horizontal">
                        <h4>Use a local account to log in.</h4>
                        <hr />
                        <asp:PlaceHolder runat="server" ID="ErrorMessage" Visible="false">
                            <p class="text-danger">
                                <asp:Literal runat="server" ID="FailureText" />
                            </p>
                        </asp:PlaceHolder>
                        <div class="form-group">
                            <asp:Label runat="server" AssociatedControlID="Email" CssClass="col-md-2 control-label">Email</asp:Label>
                            <div class="col-md-10">
                                <asp:TextBox runat="server" ID="Email" CssClass="form-control" TextMode="Email" />
                                <asp:RequiredFieldValidator runat="server" ControlToValidate="Email"
                                    CssClass="text-danger" ErrorMessage="The email field is required." />
                            </div>
                        </div>
                        <div class="form-group">
                            <asp:Label runat="server" AssociatedControlID="Password" CssClass="col-md-2 control-label">Password</asp:Label>
                            <div class="col-md-10">
                                <asp:TextBox runat="server" ID="Password" TextMode="Password" CssClass="form-control" />
                                <asp:RequiredFieldValidator runat="server" ControlToValidate="Password" CssClass="text-danger" ErrorMessage="The password field is required." />
                            </div>
                        </div>
                        <div class="form-group">
                            <div class="col-md-offset-2 col-md-10">
                                <div class="checkbox">
                                    <asp:CheckBox runat="server" ID="RememberMe" />
                                    <asp:Label runat="server" AssociatedControlID="RememberMe">Remember me?</asp:Label>
                                </div>
                            </div>
                        </div>
                        <div class="form-group">
                            <div class="col-md-offset-2 col-md-10">
                                <asp:Button runat="server" OnClick="LogIn" Text="Log in" CssClass="btn btn-default" />
                                &nbsp;&nbsp;
                                <asp:Button runat="server" ID="ResendConfirm"  OnClick="SendEmailConfirmationToken" Text="Resend confirmation" Visible="false" CssClass="btn btn-default" />
                            </div>
                        </div>
                    </div>
                    <p>
                        <asp:HyperLink runat="server" ID="RegisterHyperLink" ViewStateMode="Disabled">Register as a new user</asp:HyperLink>
                    </p>
                    <p>
                        <%-- Enable this once you have account confirmation enabled for password reset functionality --%>
                        <asp:HyperLink runat="server" ID="ForgotPasswordHyperLink" ViewStateMode="Disabled">Forgot your password?</asp:HyperLink>
                    </p>
                </section>
            </div>
    
            <div class="col-md-4">
                <section id="socialLoginForm">
                    <uc:OpenAuthProviders runat="server" ID="OpenAuthLogin" />
                </section>
            </div>
        </div>
    </asp:Content>
    
  4. Elimine las cuentas de la tabla AspNetUsers que contengan el alias de correo electrónico que quiera probar.

  5. Ejecute la aplicación (F5) y registre la dirección de correo electrónico.

  6. Antes de confirmar la nueva cuenta a través del correo electrónico que acaba de enviar, intente iniciar sesión con la nueva cuenta.
    Verá que no puede iniciar sesión y que debe tener una cuenta de correo electrónico confirmada. Además, ahora puede volver a enviar un mensaje de confirmación a su cuenta de correo electrónico.

  7. Escriba la dirección de correo electrónico y la contraseña y presione el botón Volver a enviar la confirmación.

  8. Una vez que confirme la dirección de correo electrónico en función del mensaje de correo electrónico recién enviado, inicie sesión en la aplicación.

Solución de problemas de la aplicación

Si no recibe un correo electrónico que contenga el vínculo para comprobar las credenciales:

  • Compruebe la carpeta de correo no deseado.
  • Inicie sesión en su cuenta de SendGrid y haga clic en el vínculo Actividad de correo electrónico.
  • Asegúrese de que ha usado el nombre de la cuenta de usuario de SendGrid como un valor Web.config en lugar de la dirección de correo electrónico de la cuenta de SendGrid.

Recursos adicionales