ユーザー登録画面
最後に、ユーザー登録画面を作成し、ユーザー作成処理を組み込みます(リスト6)。
protected void register_Click(object sender, EventArgs e) { if (Page.IsValid) { var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>(); // (1)画面の入力値よりユーザーオブジェクトを作成 var user = new ApplicationUser { UserName = userName.Text }; // (2)ユーザー作成、登録 var result = manager.Create(user, password.Text); if (!result.Succeeded) { // (3)ユーザー作成でエラーがあれば画面に表示 ErrorMessage.Text = result.Errors.FirstOrDefault(); return; } // (4)ログイン処理 var authenticationManager = HttpContext.Current.GetOwinContext().Authentication; var identity = manager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie); authenticationManager.SignIn(identity); // (5)遷移元画面に遷移する var returnUrl = Request.QueryString["ReturnUrl"]; if (string.IsNullOrEmpty(returnUrl)) { Response.Redirect("~/Members/Member.aspx"); } else { Response.Redirect(returnUrl); } } }
(1)ユーザーオブジェクト作成
ユーザー作成に必要なユーザーオブジェクトを、画面の入力値をもとに作成します。なお、ユーザーのIDはApplicationUser側のコンストラクタでGUID値を生成して設定しています。
(2)ユーザー作成、登録
UserManagerクラスのCreate拡張メソッドを呼び出し、データストアにユーザー情報を作成、登録します。引数にはユーザー情報と画面で入力したパスワードを指定します。
(3)エラー表示
登録処理のエラー有無は、Create拡張メソッドの戻り値であるIdentityResult型オブジェクトのSucceededプロパティがtrueかどうかで判定できます。falseであればエラーがあるということなので、さらにErrorsプロパティよりASP.NET Identityが内部で自動的に設定してくれたエラーメッセージを取得して表示します。ErrorsプロパティはIEnumerable<string>型なので、LINQのFirstOrDefaultメソッドを使って最初のメッセージのみ表示します。
なお、このメッセージを日本語化するためには、以下の日本語リソースをNuGetでインストールする必要があります。
PM> Install-Package Microsoft.AspNet.Identity.Owin.ja PM> Install-Package Microsoft.AspNet.Identity.Core.ja
(4)、(5)ログイン処理と画面遷移
ログイン画面と同様、ユーザー情報から識別情報を作成し、ログイン処理を行った後、メンバーページに遷移します。
以上で、ユーザー登録を行うことができるようになりました。実際に実行して、動作を確認してみてください。
ASP.NET Identityのユニットテスト
前回と今回のようなカスタマイズ処理の実装は、実際にWebアプリケーションを起動して動作確認をして進めるのは、少し手間です。そこで、単体テストプロジェクトを作成し、UserManagerクラスを使った操作をユニットテストで実行しながら確認しました(リスト7)。詳しくはサンプルを参照してください。
[TestMethod] public void ユーザー情報を検索する() { manager.Create(new ApplicationUser { UserName = "takano-s" }, "123456"); var user = manager.Find("takano-s", "123456"); user.UserName.Is("takano-s"); }
まとめ
今回はRedisでユーザー情報を管理するため、独自にユーザー作成処理を実装し、ユーザー取得処理も変更しました。今回のポイントは以下の通りです。
- ユーザー登録にはUserManagerクラスのCreate拡張メソッドを使う
-
任意のデータストアへの登録処理を行うにはUserStoreクラスの以下のメソッドを実装する
- SetPasswordHashAsync非同期メソッド
- FindByNameAsync非同期メソッド
- CreateAsync非同期メソッド
-
UserManagerクラスのCreate拡張メソッドの処理結果は戻り値のIdentityResultオブジェクトで判定する
- Succeededプロパティ:処理が成功したかどうか
-
Errorsプロパティ:処理が失敗した場合のエラーメッセージ
- エラーメッセージの日本語化には日本語リソースをNuGetでインストールする
- CloudStructuresを使うとRedisにオブジェクトを簡単に保管できる
-
RedisはKVSであり、キーとなる項目以外で情報を取得できないため、2つのハッシュを使って名前での検索を実現する
- userIds:ユーザー名でIDを取得
- users:IDでユーザー情報を種痘
次回は本連載の締めくくりとして、7/20にリリースされたVisual Studio 2015に搭載されている、最新の「ASP.NET 5 Preview」におけるASP.NET Identityについて取り上げます。お楽しみに。
参考資料
- 1)Overview of Custom Storage Providers for ASP.NET Identity | The ASP.NET Site
- 2)Implementing custom password policy using ASP.NET Identity - .NET Web Development and Tools Blog - Site Home - MSDN Blogs
- 3)kakakikikekeのブログ: Windows7にredisをインストールしてみた
- 4)redisドキュメント日本語訳 — redis 2.0.3 documentation
- 5)neue cc - CloudStructures 1.0 - StackExchange.Redis対応、RedisInfoタブ(Glimpse)