要件定義の不安をなくす。要件定義の不安をなくす。ユニファのバックエンド分割に学ぶイノベーションメタバース開発に必要な技術の基本知識をおさらい。Boost」など、さまざまなカンファレンスを企画・運営しています。BOOKS(コードジン・ブックス)は、CodeZineの連載からカットアップした、開発現場の課題解決に役立つ書籍シリーズです。Identityをカスタマイズし、独自の認証処理を行うために必要な各種クラス群の実装方法を紹介しました。今回は引き続き、任意のデータストアを使ってユーザー情報を管理する方法を説明していきます。3ユーザー登録画面まとめ参考資料ユーザー登録処理イメージ前回は独自の認証処理を行うため、独自のUserStoreクラスを実装するところまで行いました。今回はユーザー登録に関する実装を進めていきましょう。ユーザー登録の流れを見ていきましょう(図1)。ユーザー作成処理のカスタマイズイメージRegisterページにてUserManagerExtensionsクラスを通じて、ApplicationUserManageクラスのCreateAsync非同期メソッドにユーザー情報とパスワードを渡して呼び出します。UserManagerクラスでは、内部に持つ独自に作成したApplicationUserStoreクラスを使ってユーザー情報を作成します。このユーザー作成処理は、具体的には次のような手順になっています。ユーザー情報にパスワードを設定ApplicationUserStoreクラスのSetPasswordHashAsync非同期メソッドを呼び出し、UserManager.CreateAsync非同期メソッドに渡されたユーザー情報に、画面で入力したパスワードを設定します。この時、パスワードの妥当性もPasswordValidatorクラスを使って判定します。ユーザー情報の検証UserValidatorクラスを使い、ユーザー情報の妥当性を判定します。この中では、ApplicationUserStoreクラスのFindByNameAsync非同期メソッドを呼び出し、既存のユーザー名と同じでないかどうかも判定します。ユーザー情報の作成ApplicationUserStoreクラスのCreateAsync非同期メソッドを呼び出し、任意のデータストアにユーザー情報を作成、登録します。したがって、今回はApplicationUserStoreクラスの以下の3メソッドを実装していくことになります。SetPasswordHashAsyncFindByNameAsyncCreateAsyncなお、パスワードやユーザー情報の検証については、既定の動作をそのまま利用するので、今回は実装しません。独自の検証処理ユーザー情報、パスワードの検証処理を独自に実装したい場合はそれぞれ次のようにします。ユーザー情報IIdentityValidator<TUser>インターフェースを実装したクラスとして定義し、UserManagerオブジェクトのUserValidatorプロパティに設定する。パスワードIIdentityValidator<string>インターフェースを実装したクラスとして定義し、UserManagerオブジェクトのPasswordValidatorプロパティに設定する。詳しくは参考資料2)などを参照してください。Redisを使ったユーザー管理それでは、ユーザー登録処理の具体的な実装方法を見ていきましょう。今回は最近流行りのKVS(Key-Valueストア)である「Redis」を使ってユーザー情報を管理してみます。Redis自体については本記事では説明しません。検証用のRedisのインストール方法や操作方法などは、参考資料の3)、4)を参考にしてください。ユーザー情報管理方法Redisはリレーショナルデータベースのテーブルと違い、キーに対する値を登録/取得します。したがって、単純にIDに対するユーザー情報を登録するだけでは、ユーザー情報を名前で取得することができません。この問題を解決するため、今回は以下の2つのキーでハッシュを作り、ユーザー情報を管理します(図2)。Redisでのユーザー情報管理イメージ例えば、"takano-s"という名前のユーザー情報は、次の手順で取得することになります。userIdsハッシュより"takano-s"ユーザーのIDを取得する1.で取得したIDを使い、usersハッシュよりユーザー情報を取得するCloudStructuresの導入Redisを操作するライブラリはいくつかありますが、今回はユーザー情報という「オブジェクト」を保管する必要があり、こういった時に必要なシリアライズ/デシリアライズ(直列化/非直列化)まで面倒を見てくれる「CloudStructures」を使用することとします。MVPである河合宜文氏が作成したライブラリで、Redisとオブジェクトのマッピング、非同期なAPIが特徴です。詳しくは参照資料5)を参照ください。CloudStructuresの導入はNuGetを使って行います。CloudStructuresCloudStructuresを導入したら、参考資料5)の記事を参考に、Redis操作用のRedisServerクラスを作成します(リスト1)。NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。ショウ)<個人紹介>新潟県長岡市在住の在宅リモートワークプログラマー。家事や育児、仕事の合間に長岡IT開発者勉強会(NDS)、Niigata.NET、TDDBCなどのコミュニティに関わったり、Web記事や書籍などの執筆を行ったりしている。2017対応』(日経BP社、2017)など。