Поделиться через


Создание безопасного приложения веб-форм ASP.NET с регистрацией пользователей, подтверждением электронной почты и сбросом пароля (C#)

Эрик Рейтан (Erik Reitan)

В этом руководстве показано, как создать приложение ASP.NET Web Forms с регистрацией пользователя, подтверждением электронной почты и сбросом пароля с помощью системы членства ASP.NET Identity. Это руководство было основано на учебнике По MVC Рика Андерсона.

Введение

В этом руководстве описаны шаги, необходимые для создания приложения ASP.NET Web Forms с помощью Visual Studio и ASP.NET 4.5 для создания безопасного приложения веб-формы с регистрацией пользователя, подтверждением электронной почты и сбросом пароля.

Учебные задачи и сведения:

Создание приложения ASP.NET Web Forms

Примечание

Предупреждение. Для работы с этим руководством необходимо установить Visual Studio 2013 обновление 3 или более поздней версии.

  1. Создайте проект (Файл ->Новый проект) и выберите шаблон веб-приложения ASP.NET и последнюю версию платформа .NET Framework в диалоговом окне Новый проект.

  2. В диалоговом окне Новый проект ASP.NET выберите шаблон веб-формы. Оставьте для проверки подлинности по умолчанию значение Индивидуальные учетные записи пользователей. Если вы хотите разместить приложение в Azure, оставьте флажок Разместить в облаке проверка.
    Затем нажмите кнопку ОК , чтобы создать проект.
    Диалоговое окно

  3. Включите протокол SSL для проекта. Выполните действия, описанные в разделе Включение SSL для Projectсерии начало работы с веб-формы.

  4. Запустите приложение, щелкните ссылку Регистрация и зарегистрируйте нового пользователя. На этом этапе единственная проверка сообщения электронной почты основана на атрибуте [EmailAddress] , чтобы убедиться, что адрес электронной почты правильно сформирован. Вы измените код, чтобы добавить подтверждение по электронной почте. Закройте окно браузера.

  5. В Обозреватель сервера Visual Studio (Представление ->Server Обозреватель) перейдите в раздел Подключения к данным\DefaultConnection\Tables\AspNetUsers, щелкните правой кнопкой мыши и выберите Открыть определение таблицы.

    На следующем рисунке показана AspNetUsers схема таблицы:

    Схема таблицы AspNetUsers

  6. В Обозреватель сервера щелкните правой кнопкой мыши таблицу AspNetUsers и выберите Показать данные таблицы.

    Данные таблицы AspNetUsers
    На этом этапе сообщение электронной почты зарегистрированного пользователя не подтверждено.

  7. Щелкните строку и выберите удалить, чтобы удалить пользователя. Вы добавите это сообщение еще раз на следующем шаге и отправите сообщение с подтверждением на адрес электронной почты.

Подтверждение Email

Рекомендуется подтвердить сообщение электронной почты во время регистрации нового пользователя, чтобы убедиться, что он не олицетворяет другого пользователя (т. е. он не зарегистрирован с чужой электронной почтой). Предположим, у вас есть форум для обсуждения, и вы хотите запретить "bob@cpandl.com" регистрацию в качестве "joe@contoso.com". Без подтверждения "joe@contoso.com" сообщения электронной почты может получать нежелательные сообщения электронной почты из вашего приложения. Предположим, Что Боб случайно зарегистрировался как и не заметил этого, он не сможет использовать восстановление пароля, так как "bib@cpandl.com" в приложении нет правильной электронной почты. Email подтверждение обеспечивает только ограниченную защиту от ботов и не обеспечивает защиту от определенных спамеров.

Как правило, вы хотите запретить новым пользователям публиковать какие-либо данные на вашем веб-сайте до того, как они будут подтверждены электронной почтой, SMS-сообщением или другим механизмом. В разделах ниже мы включим подтверждение по электронной почте и изменим код, чтобы предотвратить вход новых зарегистрированных пользователей до тех пор, пока их электронная почта не будет подтверждена. В этом руководстве вы будете использовать службу электронной почты SendGrid.

Подключение SendGrid

С момента написания этого руководства в SendGrid был изменен его API. Текущие инструкции по SendGrid см. в разделе SendGrid или Включение подтверждения учетной записи и восстановления пароля.

Хотя в этом руководстве показано, как добавлять уведомления по электронной почте только с помощью SendGrid, вы можете отправлять сообщения электронной почты с помощью SMTP и других механизмов (см. дополнительные ресурсы).

  1. В Visual Studio откройте консоль диспетчера пакетов (Инструменты ->Диспетчер пакетов NuGet ->Консоль диспетчера пакетов) и введите следующую команду:
    Install-Package SendGrid

  2. Перейдите на страницу регистрации Azure SendGrid и зарегистрируйте бесплатную учетную запись SendGrid. Вы также можете зарегистрироваться для получения бесплатной учетной записи SendGrid непосредственно на сайте SendGrid.

  3. В Обозреватель решений откройте файл IdentityConfig.cs в папке App_Start и добавьте следующий код, выделенный желтым цветом, EmailService в класс для настройки 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. Кроме того, добавьте следующие using инструкции в начало файла IdentityConfig.cs :

    using SendGrid;
    using System.Net;
    using System.Configuration;
    using System.Diagnostics;
    
  5. Чтобы сделать этот пример простым, вы сохраните значения учетной записи службы электронной почты в appSettings разделе файлаweb.config . Добавьте следующий XML-код, выделенный желтым цветом, в файл web.config в корне проекта:

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

    Предупреждение

    Безопасность— никогда не сохраняйте конфиденциальные данные в исходном коде. В этом примере учетная запись и учетные данные хранятся в разделе appSetting файлаWeb.config . В Azure эти значения можно безопасно хранить на вкладке Настройка в портал Azure. Дополнительные сведения см. в статье Рика Андерсона "Рекомендации по развертыванию паролей и других конфиденциальных данных в ASP.NET и Azure".

  6. Добавьте значения службы электронной почты, отражающие значения проверки подлинности SendGrid (имя пользователя и пароль), чтобы вы могли успешно отправлять сообщения электронной почты из приложения. Не забудьте использовать имя учетной записи SendGrid, а не указанный адрес электронной почты SendGrid.

Включение подтверждения Email

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

  1. В папке Учетная запись откройте код программной части Register.aspx.cs и обновите CreateUser_Click метод , чтобы включить следующие выделенные изменения:

    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. В Обозреватель решений щелкните правой кнопкой мыши Default.aspx и выберите Пункт Начальная страница.

  3. Запустите приложение, нажав клавишу F5. После отображения страницы щелкните ссылку Зарегистрировать , чтобы отобразить страницу Регистрация.

  4. Введите адрес электронной почты и пароль, а затем нажмите кнопку Зарегистрировать , чтобы отправить сообщение электронной почты через SendGrid.
    Текущее состояние проекта и кода позволит пользователю войти в систему после заполнения формы регистрации, даже если он не подтвердил свою учетную запись.

  5. Проверьте учетную запись электронной почты и щелкните ссылку, чтобы подтвердить адрес электронной почты.
    После отправки формы регистрации вы войдете в систему.
    Пример веб-сайта: вход

Требование подтверждения Email перед войдите в систему

Хотя вы подтвердили учетную запись электронной почты, на этом этапе вам не нужно будет переходить по ссылке, содержащейся в сообщении электронной почты для проверки, чтобы полностью войти в систему. В следующем разделе вы измените код, требующий от новых пользователей подтверждать сообщение электронной почты, прежде чем они будут входить в систему (проходить проверку подлинности).

  1. В Обозреватель решений Visual Studio обновите CreateUser_Click событие в коде программной части Register.aspx.cs, который содержится в папке Accounts, со следующими выделенными изменениями:

    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. Обновите LogIn метод в коде программной части Login.aspx.cs , указав следующие выделенные изменения:

    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;
                    }
                }
            }
        }          
    }
    

Запуск приложения

Теперь, когда вы реализовали код для проверка, был ли подтвержден адрес электронной почты пользователя, можно проверка функциональные возможности на страницах Регистрация и Вход.

  1. Удалите все учетные записи в таблице AspNetUsers , содержащие псевдоним электронной почты, который вы хотите проверить.
  2. Запустите приложение (F5) и убедитесь, что вы не можете зарегистрироваться в качестве пользователя, пока не подтвердите свой адрес электронной почты.
  3. Перед подтверждением новой учетной записи с помощью только что отправленного сообщения электронной почты попробуйте войти с помощью новой учетной записи.
    Вы увидите, что вы не можете войти в систему и что у вас должна быть подтвержденная учетная запись электронной почты.
  4. После подтверждения адреса электронной почты войдите в приложение.

Восстановление и сброс паролей

  1. В Visual Studio удалите символы комментариев из Forgot метода в коде программной части Forgot.aspx.cs , который содержится в папке Account , чтобы метод выглядел следующим образом:

    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. Откройте страницу Login.aspx . Замените разметку в конце раздела loginForm , как показано ниже:

    <%@ 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. Откройте код программной части Login.aspx.cs и раскомментируйте следующую строку кода, выделенную желтым цветом в обработчике 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. Запустите приложение, нажав клавишу F5. После отображения страницы щелкните ссылку Вход.

  5. Щелкните ссылку Забыли пароль? , чтобы открыть страницу Забыли пароль .

  6. Введите свой адрес электронной почты и нажмите кнопку Отправить , чтобы отправить сообщение электронной почты на ваш адрес, который позволит сбросить пароль.
    Проверьте учетную запись электронной почты и щелкните ссылку, чтобы открыть страницу Сброс пароля .

  7. На странице Сброс пароля введите адрес электронной почты, пароль и подтвержденный пароль. Затем нажмите кнопку Сброс .
    После успешного сброса пароля откроется страница Измененный пароль . Теперь вы можете войти с помощью нового пароля.

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

  1. В Visual Studio откройте код программной части Login.aspx.cs и добавьте следующий обработчик событий после обработчика 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. Измените LogIn обработчик событий в коде программной части Login.aspx.cs , изменив код, выделенный желтым цветом, следующим образом:

    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. Обновите страницу Login.aspx , добавив код, выделенный желтым цветом, следующим образом:

    <%@ 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. Удалите все учетные записи в таблице AspNetUsers , содержащие псевдоним электронной почты, который вы хотите проверить.

  5. Запустите приложение (F5) и зарегистрируйте свой адрес электронной почты.

  6. Перед подтверждением новой учетной записи с помощью только что отправленного сообщения электронной почты попробуйте войти с помощью новой учетной записи.
    Вы увидите, что вы не можете войти в систему и что у вас должна быть подтвержденная учетная запись электронной почты. Кроме того, теперь вы можете повторно отправить сообщение с подтверждением в свою учетную запись электронной почты.

  7. Введите адрес электронной почты и пароль, а затем нажмите кнопку Повторно отправить подтверждение .

  8. Подтвердив свой адрес электронной почты на основе только что отправленного сообщения электронной почты, войдите в приложение.

Устранение неполадок с приложением

Если вы не получили сообщение электронной почты со ссылкой для проверки учетных данных:

  • Проверьте папку нежелательной почты или спама.
  • Войдите в учетную запись SendGrid и щелкните ссылку Email Действие.
  • Убедитесь, что вы использовали имя учетной записи пользователя SendGrid в качестве Web.config значения, а не адрес электронной почты учетной записи SendGrid.

Дополнительные ресурсы