SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ASP.NET Identity入門

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

ASP.NET Identity入門 第13回

  • X ポスト
  • このエントリーをはてなブックマークに追加

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

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

 前回は独自の認証処理を行うため、独自の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);
    }
  }
}

次のページ
UserStoreクラス実装

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
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本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

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

<個人紹介>新潟県長岡市在住の在宅リモートワークプログラマー。家事や育児、仕事の合間に長岡IT開発者勉強会(NDS)、Niigata.NET、TDDBCなどのコミュニティに関わったり、Web記事や書籍などの執筆を行ったりしている。著書に『アプリを作ろう! Visual C#入門 Visual C# 2017対応』(日経BP社、2017)など。<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/8905 2015/09/07 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング