株式会社インデペンデンスシステムズ横浜

システム開発エンジニアの西田五郎が運営しております。Raspberry Pi や Arduino その他新規開発案件のご依頼をお待ちしております。

*

ASP.NETユーザ管理(その3)ユーザ登録時のメール確認

   

ASP.NETユーザ管理(ASP.NET Identityフレームワーク)の3回目です。前回は、ASP.NET Identityのクラス、インターフェース構成とWebFormsでのテンプレートでの初期状態とカスタマイズに関して簡単ですが書きました。今回から実際にカスタマイズしながら確認します。まずは、ユーザ登録時のメール確認の処理を追加してみます。エラー処理、メールの本文の内容等全体的にテスト的なカスタマイズです。細かい検証は行っていませんのでその点はご了承下さい。

今回のソース一式はこちらです。今回の部分は(ISY01)ではじまるコメントを付けています。

まずは、WebFormsのテンプレートのプロジェクトを作成します。

メニュー → 新しいプロジェクト から ASP.NET Webアプリケーションを選択して、必要に応じて任意のプロジェクト名を入力します。以下では、ASPNETWebFormsIdentityというプロジェクト名にしています。
0002

次に、Web Formsのテンプレートを選択します。
0006

以上でプロジェクトは出来ました。まず初期状態のユーザ登録を確認します。
メニュー → ビルド → ソリューションのビルド でビルド後、メニュー → デバッグ → デバッグなしで開始 で実行します。 
画面右上の「登録」からユーザ登録画面に移行します。
0007

ここでユーザ登録が出来ますが、登録後すぐにログインされます。これを登録されたアドレスへメールを送信して、メールのリンクから登録完了という流れに変更します。
0010

このユーザ登録ページは、ホーム/Account/Register.aspxです。まずは、このページでボタンの下に以下のメッセージを追加しました。「仮登録が完了しました。メールを確認して認証を実行ください。」というメッセージを表示します。

<div class="form-group">
    <div class="col-md-offset-2 col-md-10">
        <asp:Button runat="server" OnClick="CreateUser_Click" Text="登録" CssClass="btn btn-default" />
    </div>
</div>
<%--仮登録メッセージ--%>
<div class="form-group">
    <div class="col-md-offset-2 col-md-10">
        <asp:Label ID="lblConfirm" runat="server" Text="仮登録が完了しました。メールを確認して認証を実行ください。" Visible="False"></asp:Label>
    </div>
</div>

ビハインドコードの Register.aspx.cs でユーザ登録時の処理を以下のように変更しました。アカウントの確認(メール認証)のメールを送信します。

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)
     {
     	//ここでサインイン(ログイン)はしない
        //IdentityHelper.SignIn(manager, user, isPersistent: false);

        // アカウントの確認とパスワードの再設定を有効にする方法については、http://go.microsoft.com/fwlink/?LinkID=320771 を参照してください
        string code = manager.GenerateEmailConfirmationToken(user.Id);
        string callbackUrl = IdentityHelper.GetUserConfirmationRedirectUrl(code, user.Id);

        //URL作成
        string domainName = Request.Url.GetLeftPart(UriPartial.Authority) + Request.ApplicationPath;
        string url = domainName + callbackUrl;

        //HTMLテキストの作成
        string linktext = "このリンクをクリックすることによってアカウントを確認してください。  " + url;

        manager.SendEmail(user.Id, "アカウントの確認", linktext);

        //リダイレクトしないでメッセージを表示
        lblConfirm.Visible = true;
        //IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response);
     }
     else
     {
          ErrorMessage.Text = result.Errors.FirstOrDefault();
     }
 }

ログイン処理のビハインドコードの ホーム/Account/Login.aspx.cs でログイン処理を以下のように変更しました。メール認証を必須にします。

protected void LogIn(object sender, EventArgs e)
{
    if (IsValid)
    {
        // ユーザーのパスワードを検証します
        var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
        ApplicationUser user = manager.Find(Email.Text, Password.Text);
        if (user != null)
        {
            //ログインの際にメール確認を条件にする
            if (!user.EmailConfirmed)
            {
                FailureText.Text = "メールで認証を行ってください。";
                ErrorMessage.Visible = true;
                return;
            }

            IdentityHelper.SignIn(manager, user, RememberMe.Checked);
            IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response);
        }
        else
        {
            FailureText.Text = "ユーザー名またはパスワードが無効です。";
            ErrorMessage.Visible = true;
        }
    }
}

ホーム/App_Start/IdentityConfig.cs でメール送信処理を以下のように変更しました。以下は、gmailを使った例です。

public class EmailService : IIdentityMessageService
{
    public Task SendAsync(IdentityMessage message)
    {
        // 電子メールを送信するには、電子メール サービスをここにプラグインします。
        // ユーザ登録メール送信
        System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage(
            "xxxxx@gmail.com",
            message.Destination,
            message.Subject,
            message.Body);

        System.Net.Mail.SmtpClient sc = new System.Net.Mail.SmtpClient();

        //SMTPサーバーを設定する
        sc.Host = "smtp.gmail.com";
        sc.Port = 587;
        sc.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;

        //ユーザー名とパスワードを設定する
        sc.Credentials = new System.Net.NetworkCredential("accountname", "password");

        //SSLを使用する
        sc.EnableSsl = true;

        //メッセージを送信する
        sc.Send(msg);

        //後処理
        msg.Dispose();
        sc.Dispose();

        return Task.FromResult(0);
    }
}

これで、ユーザ登録時にメールを送信して、認証完了後にのみログインが出来るようになりました。次回は、ユーザ情報のプロパティを追加してみます。

今回のシリーズの一覧
ASP.NETユーザ管理(その1)identityフレームワーク
ASP.NETユーザ管理(その2)WebFormsでのASP.NET Identity
ASP.NETユーザ管理(その3)ユーザ登録時のメール確認
ASP.NETユーザ管理(その4)ユーザ情報の追加
ASP.NETユーザ管理(その5)メンバー専用エリアと管理者ページ
ASP.NETユーザ管理(その6)ロール管理の追加
ASP.NETユーザ管理(その7)ユーザアカウントロック
ASP.NETユーザ管理(その8) 2要素認証
ASP.NETユーザ管理(その9) パスワードのリセット

 - ASP.NET

AdSense

AdSense

  関連記事

no image
ASP.NETユーザ管理(その1)identityフレームワーク

今現在で最新のVisual Studio 2013で利用可能なASP.NETでの …

ASP.NET Web APIでデータ蓄積(その4)ASP.NET ApiControllerクラスとView

ASP.NET Web APIでデータ蓄積の4回目です。前回はASP.NET A …

no image
ASP.NETユーザ管理(その7)ユーザアカウントロック

ASP.NETユーザ管理(ASP.NET Identityフレームワーク)の7回 …

no image
ASP.NETユーザ管理(その8) 2要素認証

ASP.NETユーザ管理(ASP.NET Identityフレームワーク)の8回 …

no image
ASP.NETユーザ管理(その5)メンバー専用エリアと管理者ページ

ASP.NETユーザ管理(ASP.NET Identityフレームワーク)の5回 …

ASP.NET Web APIでデータ蓄積(その1)ASP.NET Web APIとは

ASP.NET Web APIを利用してデータを蓄積する機能を実装してみたいと思 …

no image
Microsoft AzureでSQL DBを使ってみる(その1)概要とASP.NETサイトの作成

以下の投稿で、Microsoft AzureでASP.NETサイトを公開してみま …

no image
ASP.NETユーザ管理(その4)ユーザ情報の追加

ASP.NETユーザ管理(ASP.NET Identityフレームワーク)の4回 …

no image
Microsoft AzureでSQL DBを使ってみる(その2)Azureでの公開

前回の続きです。Microsoft Azure(以下、Azureと表記します。) …

ASP.NET Web APIでデータ蓄積(その2)ASP.NET コードファーストでのモデル構築

ASP.NET Web APIでデータ蓄積の2回目です。前回は、ASP.NET …