Создание безопасного приложения веб-форм 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
- Подключение SendGrid
- Требование подтверждения Email перед войдите в систему
- Восстановление и сброс паролей
- Повторно отправить ссылку на подтверждение Email
- Устранение неполадок с приложением
- Дополнительные ресурсы
Создание приложения ASP.NET Web Forms
Примечание
Предупреждение. Для работы с этим руководством необходимо установить Visual Studio 2013 обновление 3 или более поздней версии.
Создайте проект (Файл ->Новый проект) и выберите шаблон веб-приложения ASP.NET и последнюю версию платформа .NET Framework в диалоговом окне Новый проект.
В диалоговом окне Новый проект ASP.NET выберите шаблон веб-формы. Оставьте для проверки подлинности по умолчанию значение Индивидуальные учетные записи пользователей. Если вы хотите разместить приложение в Azure, оставьте флажок Разместить в облаке проверка.
Затем нажмите кнопку ОК , чтобы создать проект.
Включите протокол SSL для проекта. Выполните действия, описанные в разделе Включение SSL для Projectсерии начало работы с веб-формы.
Запустите приложение, щелкните ссылку Регистрация и зарегистрируйте нового пользователя. На этом этапе единственная проверка сообщения электронной почты основана на атрибуте [EmailAddress] , чтобы убедиться, что адрес электронной почты правильно сформирован. Вы измените код, чтобы добавить подтверждение по электронной почте. Закройте окно браузера.
В Обозреватель сервера Visual Studio (Представление ->Server Обозреватель) перейдите в раздел Подключения к данным\DefaultConnection\Tables\AspNetUsers, щелкните правой кнопкой мыши и выберите Открыть определение таблицы.
На следующем рисунке показана
AspNetUsers
схема таблицы:В Обозреватель сервера щелкните правой кнопкой мыши таблицу AspNetUsers и выберите Показать данные таблицы.
На этом этапе сообщение электронной почты зарегистрированного пользователя не подтверждено.Щелкните строку и выберите удалить, чтобы удалить пользователя. Вы добавите это сообщение еще раз на следующем шаге и отправите сообщение с подтверждением на адрес электронной почты.
Подтверждение Email
Рекомендуется подтвердить сообщение электронной почты во время регистрации нового пользователя, чтобы убедиться, что он не олицетворяет другого пользователя (т. е. он не зарегистрирован с чужой электронной почтой). Предположим, у вас есть форум для обсуждения, и вы хотите запретить "bob@cpandl.com"
регистрацию в качестве "joe@contoso.com"
. Без подтверждения "joe@contoso.com"
сообщения электронной почты может получать нежелательные сообщения электронной почты из вашего приложения. Предположим, Что Боб случайно зарегистрировался как и не заметил этого, он не сможет использовать восстановление пароля, так как "bib@cpandl.com"
в приложении нет правильной электронной почты. Email подтверждение обеспечивает только ограниченную защиту от ботов и не обеспечивает защиту от определенных спамеров.
Как правило, вы хотите запретить новым пользователям публиковать какие-либо данные на вашем веб-сайте до того, как они будут подтверждены электронной почтой, SMS-сообщением или другим механизмом. В разделах ниже мы включим подтверждение по электронной почте и изменим код, чтобы предотвратить вход новых зарегистрированных пользователей до тех пор, пока их электронная почта не будет подтверждена. В этом руководстве вы будете использовать службу электронной почты SendGrid.
Подключение SendGrid
С момента написания этого руководства в SendGrid был изменен его API. Текущие инструкции по SendGrid см. в разделе SendGrid или Включение подтверждения учетной записи и восстановления пароля.
Хотя в этом руководстве показано, как добавлять уведомления по электронной почте только с помощью SendGrid, вы можете отправлять сообщения электронной почты с помощью SMTP и других механизмов (см. дополнительные ресурсы).
В Visual Studio откройте консоль диспетчера пакетов (Инструменты ->Диспетчер пакетов NuGet ->Консоль диспетчера пакетов) и введите следующую команду:
Install-Package SendGrid
Перейдите на страницу регистрации Azure SendGrid и зарегистрируйте бесплатную учетную запись SendGrid. Вы также можете зарегистрироваться для получения бесплатной учетной записи SendGrid непосредственно на сайте SendGrid.
В Обозреватель решений откройте файл 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); } } }
Кроме того, добавьте следующие
using
инструкции в начало файла IdentityConfig.cs :using SendGrid; using System.Net; using System.Configuration; using System.Diagnostics;
Чтобы сделать этот пример простым, вы сохраните значения учетной записи службы электронной почты в
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".
Добавьте значения службы электронной почты, отражающие значения проверки подлинности SendGrid (имя пользователя и пароль), чтобы вы могли успешно отправлять сообщения электронной почты из приложения. Не забудьте использовать имя учетной записи SendGrid, а не указанный адрес электронной почты SendGrid.
Включение подтверждения Email
Чтобы включить подтверждение по электронной почте, измените код регистрации, выполнив следующие действия.
В папке Учетная запись откройте код программной части 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(); } }
В Обозреватель решений щелкните правой кнопкой мыши Default.aspx и выберите Пункт Начальная страница.
Запустите приложение, нажав клавишу F5. После отображения страницы щелкните ссылку Зарегистрировать , чтобы отобразить страницу Регистрация.
Введите адрес электронной почты и пароль, а затем нажмите кнопку Зарегистрировать , чтобы отправить сообщение электронной почты через SendGrid.
Текущее состояние проекта и кода позволит пользователю войти в систему после заполнения формы регистрации, даже если он не подтвердил свою учетную запись.Проверьте учетную запись электронной почты и щелкните ссылку, чтобы подтвердить адрес электронной почты.
После отправки формы регистрации вы войдете в систему.
Требование подтверждения Email перед войдите в систему
Хотя вы подтвердили учетную запись электронной почты, на этом этапе вам не нужно будет переходить по ссылке, содержащейся в сообщении электронной почты для проверки, чтобы полностью войти в систему. В следующем разделе вы измените код, требующий от новых пользователей подтверждать сообщение электронной почты, прежде чем они будут входить в систему (проходить проверку подлинности).
В Обозреватель решений 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(); } }
Обновите
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; } } } } }
Запуск приложения
Теперь, когда вы реализовали код для проверка, был ли подтвержден адрес электронной почты пользователя, можно проверка функциональные возможности на страницах Регистрация и Вход.
- Удалите все учетные записи в таблице AspNetUsers , содержащие псевдоним электронной почты, который вы хотите проверить.
- Запустите приложение (F5) и убедитесь, что вы не можете зарегистрироваться в качестве пользователя, пока не подтвердите свой адрес электронной почты.
- Перед подтверждением новой учетной записи с помощью только что отправленного сообщения электронной почты попробуйте войти с помощью новой учетной записи.
Вы увидите, что вы не можете войти в систему и что у вас должна быть подтвержденная учетная запись электронной почты. - После подтверждения адреса электронной почты войдите в приложение.
Восстановление и сброс паролей
В 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; } }
Откройте страницу 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>
Откройте код программной части 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; } }
Запустите приложение, нажав клавишу F5. После отображения страницы щелкните ссылку Вход.
Щелкните ссылку Забыли пароль? , чтобы открыть страницу Забыли пароль .
Введите свой адрес электронной почты и нажмите кнопку Отправить , чтобы отправить сообщение электронной почты на ваш адрес, который позволит сбросить пароль.
Проверьте учетную запись электронной почты и щелкните ссылку, чтобы открыть страницу Сброс пароля .На странице Сброс пароля введите адрес электронной почты, пароль и подтвержденный пароль. Затем нажмите кнопку Сброс .
После успешного сброса пароля откроется страница Измененный пароль . Теперь вы можете войти с помощью нового пароля.
Повторно отправить ссылку на подтверждение Email
После того как пользователь создает новую локальную учетную запись, ей по электронной почте будет отправлена ссылка подтверждения, с помощью которых он должен использовать, прежде чем сможет войти в систему. Если пользователь случайно удалит сообщение электронной почты с подтверждением или сообщение электронной почты никогда не поступает, ей потребуется отправить ссылку подтверждения. В следующих изменениях кода показано, как включить эту функцию.
В 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; } } }
Измените
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; } } } } }
Обновите страницу 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" /> <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>
Удалите все учетные записи в таблице AspNetUsers , содержащие псевдоним электронной почты, который вы хотите проверить.
Запустите приложение (F5) и зарегистрируйте свой адрес электронной почты.
Перед подтверждением новой учетной записи с помощью только что отправленного сообщения электронной почты попробуйте войти с помощью новой учетной записи.
Вы увидите, что вы не можете войти в систему и что у вас должна быть подтвержденная учетная запись электронной почты. Кроме того, теперь вы можете повторно отправить сообщение с подтверждением в свою учетную запись электронной почты.Введите адрес электронной почты и пароль, а затем нажмите кнопку Повторно отправить подтверждение .
Подтвердив свой адрес электронной почты на основе только что отправленного сообщения электронной почты, войдите в приложение.
Устранение неполадок с приложением
Если вы не получили сообщение электронной почты со ссылкой для проверки учетных данных:
- Проверьте папку нежелательной почты или спама.
- Войдите в учетную запись SendGrid и щелкните ссылку Email Действие.
- Убедитесь, что вы использовали имя учетной записи пользователя SendGrid в качестве Web.config значения, а не адрес электронной почты учетной записи SendGrid.
Дополнительные ресурсы
- Ссылки на ресурсы ASP.NET Identity Recommended
- Подтверждение учетной записи и восстановление пароля с помощью удостоверения ASP.NET
- ASP.NET Web Forms серии руководств. Добавление поставщика OAuth 2.0
- Развертывание приложения secure ASP.NET Web Forms с членством, OAuth и База данных SQL в Служба приложений Azure
- ASP.NET Web Forms серии руководств по включению SSL для проекта