Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

ASP.NET Identityで任意のデータストアを使う

ASP.NET Identity入門 第13回

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2015/09/07 14:00

 前回はASP.NET Identityをカスタマイズし、独自の認証処理を行うために必要な各種クラス群の実装方法を紹介しました。今回は引き続き、任意のデータストアを使ってユーザー情報を管理する方法を説明していきます。

目次

ユーザー登録処理イメージ

 前回は独自の認証処理を行うため、独自のUserStoreクラスを実装するところまで行いました。今回はユーザー登録に関する実装を進めていきましょう。まずはユーザー登録の流れを見ていきましょう(図1)。

図1 ユーザー作成処理のカスタマイズイメージ
図1 ユーザー作成処理のカスタマイズイメージ

 RegisterページにてUserManagerExtensionsクラスを通じて、ApplicationUserManageクラスのCreateAsync非同期メソッドにユーザー情報とパスワードを渡して呼び出します。UserManagerクラスでは、内部に持つ独自に作成したApplicationUserStoreクラスを使ってユーザー情報を作成します。このユーザー作成処理は、具体的には次のような手順になっています。

1) ユーザー情報にパスワードを設定

 ApplicationUserStoreクラスのSetPasswordHashAsync非同期メソッドを呼び出し、UserManager.CreateAsync非同期メソッドに渡されたユーザー情報に、画面で入力したパスワードを設定します。この時、パスワードの妥当性もPasswordValidatorクラスを使って判定します。

2) ユーザー情報の検証

 UserValidatorクラスを使い、ユーザー情報の妥当性を判定します。この中では、ApplicationUserStoreクラスのFindByNameAsync非同期メソッドを呼び出し、既存のユーザー名と同じでないかどうかも判定します。

3) ユーザー情報の作成

 ApplicationUserStoreクラスのCreateAsync非同期メソッドを呼び出し、任意のデータストアにユーザー情報を作成、登録します。

 したがって、今回はApplicationUserStoreクラスの以下の3メソッドを実装していくことになります。

  1. SetPasswordHashAsync
  2. FindByNameAsync
  3. 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形式)を格納する
図2 Redisでのユーザー情報管理イメージ
図2 Redisでのユーザー情報管理イメージ

 例えば、"takano-s"という名前のユーザー情報は、次の手順で取得することになります。

  1. userIdsハッシュより"takano-s"ユーザーのIDを取得する
  2. 1.で取得したIDを使い、usersハッシュよりユーザー情報を取得する

CloudStructuresの導入

 Redisを操作するライブラリはいくつかありますが、今回はユーザー情報という「オブジェクト」を保管する必要があり、こういった時に必要なシリアライズ/デシリアライズ(直列化/非直列化)まで面倒を見てくれる「CloudStructures」を使用することとします。CloudStructuresはMicrosoft MVPである河合宜文氏が作成したライブラリで、Redisとオブジェクトのマッピング、非同期なAPIが特徴です。詳しくは参照資料5)を参照ください。

 CloudStructuresの導入はNuGetを使って行います。

PM> Install-Package CloudStructures

 CloudStructuresを導入したら、参考資料5)の記事を参考に、Redis操作用のRedisServerクラスを作成します(リスト1)。

リスト1 Redis操作用RedisServerクラス(RedisServer.cs)
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);
    }
  }
}

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • WINGSプロジェクト 高野 将(タカノ ショウ)

    <個人紹介> 新潟県長岡市在住の在宅リモートワークプログラマー。家事や育児、仕事の合間に長岡IT開発者勉強会(NDS)、Niigata.NET、TDDBCなどのコミュニティに関わったり、Web記事や書籍などの執筆を行ったりしている。著書に『アプリを作ろう! Visual C#入門 Visual C...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

バックナンバー

連載:ASP.NET Identity入門

もっと読む

All contents copyright © 2005-2018 Shoeisha Co., Ltd. All rights reserved. ver.1.5