ダウンロード サンプルファイル (41.7 KB)
ユーザー登録画面
最後に、ユーザー登録画面を作成し、ユーザー作成処理を組み込みます(リスト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)
この記事は参考になりましたか?
既に会員の方はを行ってください。
- ASP.NET Identity入門連載記事一覧
-
- ASP.NET 5に向けて知っておきたい、最新のASP.NET Identityのポイント
- ASP.NET Identityで任意のデータストアを使う
- ASP.NET Identityで独自の認証処理を行う
- この記事の著者
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
WINGSプロジェクト 高野 将(タカノ ショウ)
<個人紹介>新潟県長岡市在住の在宅リモートワークプログラマー。家事や育児、仕事の合間に長岡IT開発者勉強会(NDS)、Niigata.NET、TDDBCなどのコミュニティに関わったり、Web記事や書籍などの執筆を行ったりしている。著書に『アプリを作ろう! Visual C#入門 Visual C# 2017対応』(日経BP社、2017)など。< WINGSプロジェクト について>有限会社 WINGSプロジェクト が運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での 登録メンバ は約50名で、現在も執筆メンバを 募集中 。興味のある方は、どしどし応募頂きたい。 著書 、 記事 多数。 RSS X: @WingsPro_info (公式)、 @WingsPro_info/wings (メンバーリスト) Facebook
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
