ログイン、電子メール確認、パスワード リセットを使用して安全な ASP.NET MVC 5 Web アプリを作成する (C#)Create a secure ASP.NET MVC 5 web app with log in, email confirmation and password reset (C#)

Rick Andersonby Rick Anderson

このチュートリアルでは、ASP.NET Identity メンバーシップシステムを使用して、電子メールの確認とパスワードのリセットを使用して ASP.NET MVC 5 web アプリを構築する方法について説明します。This tutorial shows you how to build an ASP.NET MVC 5 web app with email confirmation and password reset using the ASP.NET Identity membership system.

.NET Core を使用するこのチュートリアルの更新バージョンについては、「 ASP.NET Core でのアカウントの確認とパスワードの回復」を参照してください。For an updated version of this tutorial that uses .NET Core, see Account confirmation and password recovery in ASP.NET Core.

ASP.NET MVC アプリを作成するCreate an ASP.NET MVC app

まず、Web またはVisual Studio 2013用の Visual Studio Express 2013 をインストールして実行します。Start by installing and running Visual Studio Express 2013 for Web or Visual Studio 2013. Visual Studio 2013 Update 3以降をインストールします。Install Visual Studio 2013 Update 3 or higher.

Note

警告: このチュートリアルを完了するには、 Visual Studio 2013 Update 3以降をインストールする必要があります。Warning: You must install Visual Studio 2013 Update 3 or higher to complete this tutorial.

  1. 新しい ASP.NET Web プロジェクトを作成し、MVC テンプレートを選択します。Create a new ASP.NET Web project and select the MVC template. Web フォームでも ASP.NET Identity がサポートされているため、web フォームアプリで同様の手順に従うことができます。Web Forms also supports ASP.NET Identity, so you could follow similar steps in a web forms app.

  2. 既定の認証は、個々のユーザーアカウントとして残しておきます。Leave the default authentication as Individual User Accounts. Azure でアプリをホストする場合は、チェックボックスをオンのままにします。If you'd like to host the app in Azure, leave the check box checked. このチュートリアルの後半では、Azure にデプロイします。Later in the tutorial we will deploy to Azure. Azure アカウントは無料で開くことができます。You can open an Azure account for free.

  3. SSL を使用するようにプロジェクトを設定します。Set the project to use SSL.

  4. アプリを実行し、 [登録] リンクをクリックして、ユーザーを登録します。Run the app, click the Register link and register a user. この時点で、電子メールの検証は、 [EmailAddress]属性でのみ行うことができます。At this point, the only validation on the email is with the [EmailAddress] attribute.

  5. サーバーエクスプローラーで、 [Data Connections\DefaultConnection\Tables\AspNetUsers] に移動して右クリックし、 [テーブル定義を開く] を選択します。In Server Explorer, navigate to Data Connections\DefaultConnection\Tables\AspNetUsers, right click and select Open table definition.

    次の図は、AspNetUsers スキーマを示しています。The following image shows the AspNetUsers schema:

  6. AspNetUsersテーブルを右クリックし、 [テーブルデータの表示] を選択します。Right click on the AspNetUsers table and select Show Table Data.

    この時点で、電子メールは確認されていません。At this point the email has not been confirmed.

  7. 行をクリックし、[削除] を選択します。Click on the row and select delete. 次の手順でもう一度このメールを追加し、確認の電子メールを送信します。You'll add this email again in the next step, and send a confirmation email.

電子メールの確認Email confirmation

新しいユーザー登録の電子メールを確認して、他のユーザーが偽装していないこと (つまり、他のユーザーの電子メールに登録されていないこと) を確認することをお勧めします。It's a best practice to confirm the email of a new user registration to verify they are not impersonating someone else (that is, they haven't registered with someone else's email). ディスカッションフォーラムがあるとしたら、"bob@example.com""joe@contoso.com"として登録されないようにしたいと考えています。Suppose you had a discussion forum, you would want to prevent "bob@example.com" from registering as "joe@contoso.com". 電子メールを確認しないと、"joe@contoso.com" アプリから不要な電子メールを受け取る可能性があります。Without email confirmation, "joe@contoso.com" could get unwanted email from your app. Bob が誤って "bib@example.com" として登録されていて気付かないとしても、アプリには正しい電子メールがないため、パスワードの回復を使用することはできません。Suppose Bob accidentally registered as "bib@example.com" and hadn't noticed it, he wouldn't be able to use password recover because the app doesn't have his correct email. 電子メールの確認では、bot から制限された保護のみを提供し、特定のスパム送信者からの保護を提供しません。登録に使用できる多くの勤務先の電子メールエイリアスがあります。Email confirmation provides only limited protection from bots and doesn't provide protection from determined spammers, they have many working email aliases they can use to register.

通常は、電子メール、SMS テキストメッセージ、または別のメカニズムによって確認される前に、新しいユーザーが web サイトにデータを投稿できないようにします。You generally want to prevent new users from posting any data to your web site before they have been confirmed by email, a SMS text message or another mechanism. 以下のセクションでは、電子メールの確認を有効にし、コードを変更して、新しく登録されたユーザーが電子メールを確認するまでログインできないようにします。In the sections below, we will enable email confirmation and modify the code to prevent newly registered users from logging in until their email has been confirmed.

SendGrid をフックするHook up SendGrid

このセクションの手順は最新ではありません。The instructions in this section are not current. 詳細な手順については、「 SendGrid 電子メールプロバイダーの構成」を参照してください。See Configure SendGrid email provider for updated instructions.

このチュートリアルでは、 Sendgridを使用して電子メール通知を追加する方法のみを説明していますが、SMTP などのメカニズムを使用して電子メールを送信することもできます。Although this tutorial only shows how to add email notification through SendGrid, you can send email using SMTP and other mechanisms (see additional resources).

  1. パッケージ マネージャー コンソールで、次のコマンドを入力します。In the Package Manager Console, enter the following command:

    Install-Package SendGrid
    
  2. Azure SendGrid のサインアップページにアクセスし、無料の sendgrid アカウントを登録します。Go to the Azure SendGrid sign up page and register for a free SendGrid account. App_Start/identityconfig.csで次のようなコードを追加して、sendgrid を構成します。Configure SendGrid by adding code similar to the following in App_Start/IdentityConfig.cs:

    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(
                              "Joe@contoso.com", "Joe S.");
          myMessage.Subject = message.Subject;
          myMessage.Text = message.Body;
          myMessage.Html = message.Body;
    
          var credentials = new NetworkCredential(
                     ConfigurationManager.AppSettings["mailAccount"],
                     ConfigurationManager.AppSettings["mailPassword"]
                     );
    
          // 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);
          }
       }
    }
    

次のインクルードを追加する必要があります。You'll need to add the following includes:

using SendGrid;
using System.Net;
using System.Configuration;
using System.Diagnostics;

このサンプルを簡単に保つために、アプリケーションの設定を web.configファイルに保存しますTo keep this sample simple, we'll store the app settings in the web.config file:

</connectionStrings>
   <appSettings>
      <add key="webpages:Version" value="3.0.0.0" />
      <!-- Markup removed for clarity. -->
      
      <add key="mailAccount" value="xyz" />
      <add key="mailPassword" value="password" />
   </appSettings>
  <system.web>

Warning

セキュリティ-機密データをソースコードに格納しません。Security - Never store sensitive data in your source code. アカウントと資格情報は appSetting に格納されます。The account and credentials are stored in the appSetting. Azure では、これらの値を Azure portal の [ 構成 ] タブに安全に格納できます。On Azure, you can securely store these values on the Configure tab in the Azure portal. ASP.NET と Azure にパスワードやその他の機密データをデプロイするためのベストプラクティスをご覧ください。See Best practices for deploying passwords and other sensitive data to ASP.NET and Azure.

アカウントコントローラーで電子メールの確認を有効にするEnable email confirmation in the Account controller

//
// POST: /Account/Register
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
    if (ModelState.IsValid)
    {
        var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
        var result = await UserManager.CreateAsync(user, model.Password);
        if (result.Succeeded)
        {
            await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);

            string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
            var callbackUrl = Url.Action("ConfirmEmail", "Account", 
               new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
            await UserManager.SendEmailAsync(user.Id, 
               "Confirm your account", "Please confirm your account by clicking <a href=\"" 
               + callbackUrl + "\">here</a>");

            return RedirectToAction("Index", "Home");
        }
        AddErrors(result);
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}

Views\Account\ConfirmEmail.cshtmlファイルに正しい razor 構文があることを確認します。Verify the Views\Account\ConfirmEmail.cshtml file has correct razor syntax. (最初の行の @ 文字が欠落している可能性があります。( The @ character in the first line might be missing. ))

@{
    ViewBag.Title = "Confirm Email";
}

<h2>@ViewBag.Title.</h2>
<div>
    <p>
        Thank you for confirming your email. Please @Html.ActionLink("Click here to Log in", "Login", "Account", routeValues: null, htmlAttributes: new { id = "loginLink" })
    </p>
</div>

アプリを実行し、[登録] リンクをクリックします。Run the app and click the Register link. 登録フォームを送信すると、ログインしたことになります。Once you submit the registration form, you are logged in.

電子メールアカウントを確認し、リンクをクリックして電子メールを確認します。Check your email account and click on the link to confirm your email.

ログインする前に電子メールの確認を要求するRequire email confirmation before log in

現在、ユーザーが登録フォームを完了すると、ログインします。Currently once a user completes the registration form, they are logged in. 通常は、ログを記録する前に電子メールを確認します。You generally want to confirm their email before logging them in. 以下のセクションでは、新しいユーザーがログイン (認証) される前に確認済みの電子メールを要求するようにコードを変更します。In the section below, we will modify the code to require new users to have a confirmed email before they are logged in (authenticated). 次の強調表示された変更を使用して、HttpPost Register メソッドを更新します。Update the HttpPost Register method with the following highlighted changes:

//
// POST: /Account/Register
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
   if (ModelState.IsValid)
   {
      var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
      var result = await UserManager.CreateAsync(user, model.Password);
      if (result.Succeeded)
      {
         //  Comment the following line to prevent log in until the user is confirmed.
         //  await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);

         string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
         var callbackUrl = Url.Action("ConfirmEmail", "Account",
            new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
         await UserManager.SendEmailAsync(user.Id, "Confirm your account",
            "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");

         // Uncomment to debug locally 
         // TempData["ViewBagLink"] = callbackUrl;

         ViewBag.Message = "Check your email and confirm your account, you must be confirmed "
                         + "before you can log in.";

         return View("Info");
         //return RedirectToAction("Index", "Home");
      }
      AddErrors(result);
   }

   // If we got this far, something failed, redisplay form
   return View(model);
}

SignInAsync メソッドをコメントアウトすることで、ユーザーは登録によってサインインされません。By commenting out the SignInAsync method, the user will not be signed in by the registration. TempData["ViewBagLink"] = callbackUrl; 行を使用して、電子メールを送信することなく、アプリをデバッグし、登録をテストできます。The TempData["ViewBagLink"] = callbackUrl; line can be used to debug the app and test registration without sending email. ViewBag.Message は、確認の指示を表示するために使用されます。ViewBag.Message is used to display the confirm instructions. ダウンロードサンプルには、電子メールを設定せずに電子メールの確認をテストするコードが含まれており、アプリケーションのデバッグにも使用できます。The download sample contains code to test email confirmation without setting up email, and can also be used to debug the application.

Views\Shared\Info.cshtml ファイルを作成し、次の razor マークアップを追加します。Create a Views\Shared\Info.cshtml file and add the following razor markup:

@{
   ViewBag.Title = "Info";
}
<h2>@ViewBag.Title.</h2>
<h3>@ViewBag.Message</h3>

承認属性を Home コントローラーの Contact アクションメソッドに追加します。Add the Authorize attribute to the Contact action method of the Home controller. [Contact] リンクをクリックすると、匿名ユーザーがアクセス権を持っていないこと、および認証されたユーザーがアクセス権を持っていないことを確認できます。You can click on the Contact link to verify anonymous users don't have access and authenticated users do have access.

[Authorize]
public ActionResult Contact()
{
   ViewBag.Message = "Your contact page.";

   return View();
}

また、HttpPost Login アクションメソッドも更新する必要があります。You must also update the HttpPost Login action method:

//
// POST: /Account/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }

    // Require the user to have a confirmed email before they can log on.
    var user = await UserManager.FindByNameAsync(model.Email);
    if (user != null)
    {
       if (!await UserManager.IsEmailConfirmedAsync(user.Id))
       {
          ViewBag.errorMessage = "You must have a confirmed email to log on.";
          return View("Error");
       }
    }

    // This doesn't count login failures towards account lockout
    // To enable password failures to trigger account lockout, change to shouldLockout: true
    var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
    switch (result)
    {
        case SignInStatus.Success:
            return RedirectToLocal(returnUrl);
        case SignInStatus.LockedOut:
            return View("Lockout");
        case SignInStatus.RequiresVerification:
            return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
        case SignInStatus.Failure:
        default:
            ModelState.AddModelError("", "Invalid login attempt.");
            return View(model);
    }
}

Views\Shared\Error.cshtmlビューを更新して、エラーメッセージを表示します。Update the Views\Shared\Error.cshtml view to display the error message:

@model System.Web.Mvc.HandleErrorInfo

@{
    ViewBag.Title = "Error";
}

<h1 class="text-danger">Error.</h1>
@{
   if (String.IsNullOrEmpty(ViewBag.errorMessage))
   {
      <h2 class="text-danger">An error occurred while processing your request.</h2>
   }
   else
   {
      <h2 class="text-danger">@ViewBag.errorMessage</h2>
   }
}

テストする電子メールエイリアスが含まれているAspNetUsersテーブル内のすべてのアカウントを削除します。Delete any accounts in the AspNetUsers table that contain the email alias you wish to test with. アプリを実行し、電子メールアドレスが確認されるまでログインできないことを確認します。Run the app and verify you can't log in until you have confirmed your email address. 電子メールアドレスを確認したら、 [Contact] リンクをクリックします。Once you confirm your email address, click the Contact link.

パスワードの回復/リセットPassword recovery/reset

アカウントコントローラーの HttpPost ForgotPassword アクションメソッドからコメント文字を削除します。Remove the comment characters from the HttpPost ForgotPassword action method in the account controller:

//
// POST: /Account/ForgotPassword
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> ForgotPassword(ForgotPasswordViewModel model)
{
    if (ModelState.IsValid)
    {
        var user = await UserManager.FindByNameAsync(model.Email);
        if (user == null || !(await UserManager.IsEmailConfirmedAsync(user.Id)))
        {
            // Don't reveal that the user does not exist or is not confirmed
            return View("ForgotPasswordConfirmation");
        }

        string code = await UserManager.GeneratePasswordResetTokenAsync(user.Id);
        var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
        await UserManager.SendEmailAsync(user.Id, "Reset Password", "Please reset your password by clicking <a href=\"" + callbackUrl + "\">here</a>");
        return RedirectToAction("ForgotPasswordConfirmation", "Account");
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}

Views\Account\Login.cshtml razor ビューファイルの ForgotPassword html.actionlinkからコメント文字を削除します。Remove the comment characters from the ForgotPassword ActionLink in the Views\Account\Login.cshtml razor view file:

@using MvcPWy.Models
@model LoginViewModel
@{
   ViewBag.Title = "Log in";
}

<h2>@ViewBag.Title.</h2>
<div class="row">
   <div class="col-md-8">
      <section id="loginForm">
         @using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
         {
            @Html.AntiForgeryToken()
            <h4>Use a local account to log in.</h4>
            <hr />
            @Html.ValidationSummary(true, "", new { @class = "text-danger" })
            <div class="form-group">
               @Html.LabelFor(m => m.Email, new { @class = "col-md-2 control-label" })
               <div class="col-md-10">
                  @Html.TextBoxFor(m => m.Email, new { @class = "form-control" })
                  @Html.ValidationMessageFor(m => m.Email, "", new { @class = "text-danger" })
               </div>
            </div>
            <div class="form-group">
               @Html.LabelFor(m => m.Password, new { @class = "col-md-2 control-label" })
               <div class="col-md-10">
                  @Html.PasswordFor(m => m.Password, new { @class = "form-control" })
                  @Html.ValidationMessageFor(m => m.Password, "", new { @class = "text-danger" })
               </div>
            </div>
            <div class="form-group">
               <div class="col-md-offset-2 col-md-10">
                  <div class="checkbox">
                     @Html.CheckBoxFor(m => m.RememberMe)
                     @Html.LabelFor(m => m.RememberMe)
                  </div>
               </div>
            </div>
            <div class="form-group">
               <div class="col-md-offset-2 col-md-10">
                  <input type="submit" value="Log in" class="btn btn-default" />
               </div>
            </div>
            <p>
               @Html.ActionLink("Register as a new user", "Register")
            </p>
            @* Enable this once you have account confirmation enabled for password reset functionality *@
            <p>
               @Html.ActionLink("Forgot your password?", "ForgotPassword")
            </p>
         }
      </section>
   </div>
   <div class="col-md-4">
      <section id="socialLoginForm">
         @Html.Partial("_ExternalLoginsListPartial", new ExternalLoginListViewModel { ReturnUrl = ViewBag.ReturnUrl })
      </section>
   </div>
</div>

@section Scripts {
   @Scripts.Render("~/bundles/jqueryval")
}

ログインページに、パスワードをリセットするためのリンクが表示されるようになります。The Log in page will now show a link to reset the password.

ユーザーは、新しいローカルアカウントを作成すると、ログオンする前に使用する必要がある確認のリンクを電子メールで送信します。Once a user creates a new local account, they are emailed a confirmation link they are required to use before they can log on. ユーザーが誤って確認メールを削除した場合、または電子メールが届いていない場合は、確認リンクを再度送信する必要があります。If the user accidentally deletes the confirmation email, or the email never arrives, they will need the confirmation link sent again. 次のコード変更は、これを有効にする方法を示しています。The following code changes show how to enable this.

次のヘルパーメソッドを、コントローラーファイルの一番下に追加します。Add the following helper method to the bottom of the Controllers\AccountController.cs file:

private async Task<string> SendEmailConfirmationTokenAsync(string userID, string subject)
{
   string code = await UserManager.GenerateEmailConfirmationTokenAsync(userID);
   var callbackUrl = Url.Action("ConfirmEmail", "Account",
      new { userId = userID, code = code }, protocol: Request.Url.Scheme);
   await UserManager.SendEmailAsync(userID, subject,
      "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");

   return callbackUrl;
}

新しいヘルパーを使用するように Register メソッドを更新します。Update the Register method to use the new helper:

//
// POST: /Account/Register
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
   if (ModelState.IsValid)
   {
      var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
      var result = await UserManager.CreateAsync(user, model.Password);
      if (result.Succeeded)
      {
         //  Comment the following line to prevent log in until the user is confirmed.
         //  await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);

         string callbackUrl = await SendEmailConfirmationTokenAsync(user.Id, "Confirm your account");

         ViewBag.Message = "Check your email and confirm your account, you must be confirmed "
                         + "before you can log in.";

         return View("Info");
         //return RedirectToAction("Index", "Home");
      }
      AddErrors(result);
   }

   // If we got this far, something failed, redisplay form
   return View(model);
}

ユーザーアカウントが確認されていない場合は、ログイン方法を更新してパスワードを再送信します。Update the Login method to resend the password if the user account has not been confirmed:

//
// POST: /Account/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
   if (!ModelState.IsValid)
   {
      return View(model);
   }

   // Require the user to have a confirmed email before they can log on.
  // var user = await UserManager.FindByNameAsync(model.Email);
   var user =  UserManager.Find(model.Email, model.Password);
   if (user != null)
   {
      if (!await UserManager.IsEmailConfirmedAsync(user.Id))
      {
         string callbackUrl = await SendEmailConfirmationTokenAsync(user.Id, "Confirm your account-Resend");

          // Uncomment to debug locally  
          // ViewBag.Link = callbackUrl;
         ViewBag.errorMessage = "You must have a confirmed email to log on. "
                              + "The confirmation token has been resent to your email account.";
         return View("Error");
      }
   }

   // This doesn't count login failures towards account lockout
   // To enable password failures to trigger account lockout, change to shouldLockout: true
   var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
   switch (result)
   {
      case SignInStatus.Success:
         return RedirectToLocal(returnUrl);
      case SignInStatus.LockedOut:
         return View("Lockout");
      case SignInStatus.RequiresVerification:
         return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
      case SignInStatus.Failure:
      default:
         ModelState.AddModelError("", "Invalid login attempt.");
         return View(model);
   }
}

ソーシャルおよびローカルログインアカウントの結合Combine social and local login accounts

電子メールリンクをクリックして、ローカルアカウントとソーシャルアカウントを組み合わせることができます。You can combine local and social accounts by clicking on your email link. 次のシーケンスでは、最初にローカルログインとして **RickAndMSFT@gmail.com** が作成されますが、最初にアカウントをソーシャルログとして作成してから、ローカルログインを追加することができます。In the following sequence **RickAndMSFT@gmail.com** is first created as a local login, but you can create the account as a social log in first, then add a local login.

[管理] リンクをクリックします。Click on the Manage link. このアカウントに関連付けられている外部ログイン: 0に注意してください。Note the External Logins: 0 associated with this account.

別のログインサービスへのリンクをクリックし、アプリの要求を受け入れます。Click the link to another log in service and accept the app requests. 2つのアカウントが結合されているので、いずれかのアカウントでログオンすることができます。The two accounts have been combined, you will be able to log on with either account. 認証サービスのソーシャルログがダウンした場合、またはソーシャルアカウントへのアクセスが失われる可能性がある場合に備えて、ユーザーにローカルアカウントを追加することをお勧めします。You might want your users to add local accounts in case their social log in authentication service is down, or more likely they have lost access to their social account.

次の図では、Tom はソーシャルログ (ページに表示されている外部ログイン: 1から参照できます) です。In the following image, Tom is a social log in (which you can see from the External Logins: 1 shown on the page).

[パスワードの選択] をクリックすると、同じアカウントに関連付けられているローカルログオンを追加できます。Clicking on Pick a password allows you to add a local log on associated with the same account.

より詳細な電子メールの確認Email confirmation in more depth

このトピックでは、ASP.NET Identity を使用したチュートリアルアカウントの確認とパスワードの回復について詳しく説明します。My tutorial Account Confirmation and Password Recovery with ASP.NET Identity goes into this topic with more details.

アプリのデバッグDebugging the app

リンクを含む電子メールが表示されない場合は、次のようになります。If you don't get an email containing the link:

  • 迷惑メールまたは迷惑メールフォルダーを確認します。Check your junk or spam folder.
  • SendGrid アカウントにログインし、 [Email Activity] リンクをクリックします。Log into your SendGrid account and click on the Email Activity link.

電子メールを使用せずに検証リンクをテストするには、完成したサンプルをダウンロードします。To test the verification link without email, download the completed sample. ページに確認のリンクと確認コードが表示されます。The confirmation link and confirmation codes will be displayed on the page.

その他のリソースAdditional Resources