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

システム開発エンジニアの西田五郎が運営しております。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

執筆者:

関連記事

no image

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

前回の続きです。Microsoft Azure(以下、Azureと表記します。)のSQLデータベース(以下 SQLDBと表記します。)を使ってみます。毎回のように書いていますが手順は一つの方法ですので …

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

ASP.NET Web APIでデータ蓄積の3回目です。前回は蓄積するデータとして温度データをイメージしてそのモデルをコードファーストで書いてみました。今回は、MVCのCでコントローラの部分です。Vの …

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

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

ASP.NET Web APIでデータ蓄積の続き(その2)グラフ表示

ASP.NET Web APIでデータ蓄積の続きの2回目です。前回は温度データを最新から一覧表示するページを作成しました。今回は温度データのグラフを表示するページを作成します。最終的に以下のように表示 …

no image

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

今現在で最新のVisual Studio 2013で利用可能なASP.NETでのユーザ認証とユーザ管理のフレームワークを使ってみました。そのユーザ管理のフレームワークは、ASP.NET Identit …