ユーザー登録処理イメージ
前回は独自の認証処理を行うため、独自のUserStoreクラスを実装するところまで行いました。今回はユーザー登録に関する実装を進めていきましょう。まずはユーザー登録の流れを見ていきましょう(図1)。
RegisterページにてUserManagerExtensionsクラスを通じて、ApplicationUserManageクラスのCreateAsync非同期メソッドにユーザー情報とパスワードを渡して呼び出します。UserManagerクラスでは、内部に持つ独自に作成したApplicationUserStoreクラスを使ってユーザー情報を作成します。このユーザー作成処理は、具体的には次のような手順になっています。
1) ユーザー情報にパスワードを設定
ApplicationUserStoreクラスのSetPasswordHashAsync非同期メソッドを呼び出し、UserManager.CreateAsync非同期メソッドに渡されたユーザー情報に、画面で入力したパスワードを設定します。この時、パスワードの妥当性もPasswordValidatorクラスを使って判定します。
2) ユーザー情報の検証
UserValidatorクラスを使い、ユーザー情報の妥当性を判定します。この中では、ApplicationUserStoreクラスのFindByNameAsync非同期メソッドを呼び出し、既存のユーザー名と同じでないかどうかも判定します。
3) ユーザー情報の作成
ApplicationUserStoreクラスのCreateAsync非同期メソッドを呼び出し、任意のデータストアにユーザー情報を作成、登録します。
したがって、今回はApplicationUserStoreクラスの以下の3メソッドを実装していくことになります。
- SetPasswordHashAsync
- FindByNameAsync
- CreateAsync
なお、パスワードやユーザー情報の検証については、既定の動作をそのまま利用するので、今回は実装しません。
独自の検証処理
ユーザー情報、パスワードの検証処理を独自に実装したい場合はそれぞれ次のようにします。
-
ユーザー情報
- IIdentityValidator<TUser>インターフェースを実装したクラスとして定義し、UserManagerオブジェクトのUserValidatorプロパティに設定する。
-
パスワード
- IIdentityValidator<string>インターフェースを実装したクラスとして定義し、UserManagerオブジェクトのPasswordValidatorプロパティに設定する。
詳しくは参考資料2)などを参照してください。
Redisを使ったユーザー管理
それでは、ユーザー登録処理の具体的な実装方法を見ていきましょう。今回は最近流行りのKVS(Key-Valueストア)である「Redis」を使ってユーザー情報を管理してみます。
なお、Redis自体については本記事では説明しません。検証用のRedisのインストール方法や操作方法などは、参考資料の3)、4)を参考にしてください。
ユーザー情報管理方法
Redisはリレーショナルデータベースのテーブルと違い、キーに対する値を登録/取得します。したがって、単純にIDに対するユーザー情報を登録するだけでは、ユーザー情報を名前で取得することができません。
この問題を解決するため、今回は以下の2つのキーでハッシュを作り、ユーザー情報を管理します(図2)。
- userIds : fieldをユーザー名とし、valueにユーザーIDを格納する
- users:fieldをユーザーIDとし、valueにユーザー情報(JSON形式)を格納する
例えば、"takano-s"という名前のユーザー情報は、次の手順で取得することになります。
- userIdsハッシュより"takano-s"ユーザーのIDを取得する
- 1.で取得したIDを使い、usersハッシュよりユーザー情報を取得する
CloudStructuresの導入
Redisを操作するライブラリはいくつかありますが、今回はユーザー情報という「オブジェクト」を保管する必要があり、こういった時に必要なシリアライズ/デシリアライズ(直列化/非直列化)まで面倒を見てくれる「CloudStructures」を使用することとします。CloudStructuresはMicrosoft MVPである河合宜文氏が作成したライブラリで、Redisとオブジェクトのマッピング、非同期なAPIが特徴です。詳しくは参照資料5)を参照ください。
CloudStructuresの導入はNuGetを使って行います。
PM> Install-Package CloudStructures
CloudStructuresを導入したら、参考資料5)の記事を参考に、Redis操作用のRedisServerクラスを作成します(リスト1)。
using System.Configuration; using CloudStructures; namespace CustomizedIdentityApp { public static class RedisServer { public static readonly RedisSettings Default; static RedisServer() { // Web.configよりRedisサーバーのホスト名やIPアドレスを取得 var redisServer = ConfigurationManager.AppSettings["RedisServer"]; Default = new RedisSettings(redisServer); } } }