ASP.NETユーザ管理(ASP.NET Identityフレームワーク)の3回目です。前回は、ASP.NET Identityのクラス、インターフェース構成とWebFormsでのテンプレートでの初期状態とカスタマイズに関して簡単ですが書きました。今回から実際にカスタマイズしながら確認します。まずは、ユーザ登録時のメール確認の処理を追加してみます。エラー処理、メールの本文の内容等全体的にテスト的なカスタマイズです。細かい検証は行っていませんのでその点はご了承下さい。
今回のソース一式はこちらです。今回の部分は(ISY01)ではじまるコメントを付けています。
まずは、WebFormsのテンプレートのプロジェクトを作成します。
メニュー → 新しいプロジェクト から ASP.NET Webアプリケーションを選択して、必要に応じて任意のプロジェクト名を入力します。以下では、ASPNETWebFormsIdentityというプロジェクト名にしています。
以上でプロジェクトは出来ました。まず初期状態のユーザ登録を確認します。
メニュー → ビルド → ソリューションのビルド でビルド後、メニュー → デバッグ → デバッグなしで開始 で実行します。
画面右上の「登録」からユーザ登録画面に移行します。
ここでユーザ登録が出来ますが、登録後すぐにログインされます。これを登録されたアドレスへメールを送信して、メールのリンクから登録完了という流れに変更します。
このユーザ登録ページは、ホーム/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) パスワードのリセット