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

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

ASP.NET

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) パスワードのリセット

AdSense

AdSense

-ASP.NET

執筆者:

関連記事

ASP.NET Web APIでデータ蓄積の続き(その1)データ表示ページ

ASP.NET Web APIでデータ蓄積というテーマで以下から始まるシリーズを書きました。まず以下のページが概要です。 ASP.NET Web APIでデータ蓄積(その1)ASP.NET Web A …

no image

ASP.NETユーザ管理(その2)WebFormsでのASP.NET Identity

ASP.NETユーザ管理の2回目です。前回は、主にASP.NET Identityとはといった概要的な内容について書きました。今回から実際に動作させながら確認します。 WebFormsのテンプレートを …

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

ASP.NET Web APIでデータ蓄積の4回目です。前回はASP.NET ApiControllerクラスについて書きました。今回はViewと連携させてみます。 まずは前回ですが、以下のようなUR …

ASP.NET Web APIでデータ蓄積(その7)Raspbery Piからの温度データ蓄積

ASP.NET Web APIでデータ蓄積の7回目です。前回までで少なくとも温度データが登録出来るASP.NET Web APIが出来ました。今回はRaspbery Piに実際に温度センサを接続して温 …

no image

ASP.NETユーザ管理(その6)ロール管理の追加

ASP.NETユーザ管理(ASP.NET Identityフレームワーク)の6回目です。前回は、メンバー専用エリアと管理者ページの各制限方法を確認しました。今回はロール管理を使ってみます。前回では、W …