SHOEISHA iD

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

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

ASP.NET Identity入門

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

ASP.NET Identity入門 第13回

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

UserStoreクラス実装

 Redisを操作する準備ができたところで、今度はユーザー情報を操作するApplicationUserStoreクラスを実装していきます。

Redisハッシュ操作用フィールド定義

 先述したuserIdsハッシュ、usersハッシュを操作するため、RedisHash型のフィールドを定義します(リスト2)。

リスト2 Redisハッシュ操作用フィールド定義(ApplicationUserStore.csより)
private readonly RedisHash<String> userIds =
  new RedisHash<String>(RedisServer.Default, "userIds");
private readonly RedisHash<String> users =
  new RedisHash<String>(RedisServer.Default, "users");
}

 CloudStructuresでRedisハッシュを操作するには、RedisHash<TKey>型を使います。userIds、usersともキーは文字列型なので、TKey型パラメーターにはstringを指定します。また、コンストラクタ引数では、先述したRedisServer型のオブジェクトと、作成するハッシュのキーを指定します。

パスワードハッシュ設定処理

 ユーザー情報にハッシュ化したパスワードを設定するため、IUserPasswordStore<TUser>インターフェースのSetPasswordHashAsync非同期メソッドを実装します(リスト3)。なお、asyncキーワードをメソッドにつけることで、Taskクラスを戻り値とする非同期メソッドをわかりやすく実装できるようになります。

リスト3 パスワードハッシュ設定処理(ApplicationUserStore.csより)
/// <summary>
/// ハッシュ化されたパスワードをユーザー情報に設定します。
/// </summary>
/// <param name="user">ユーザー情報。</param>
/// <param name="passwordHash">ハッシュ化されたパスワード。</param>
/// <returns></returns>
public async Task SetPasswordHashAsync(ApplicationUser user, string passwordHash)
{
  user.PasswordHash = passwordHash;
}

ユーザー登録処理

 データストアにユーザー情報を作成して登録するため、IUserStore<TUser>インターフェースのCreateAsync非同期メソッドを実装します(リスト4)。

リスト4 ユーザー登録処理(ApplicationUserStore.csより)
/// <summary>
/// ユーザー情報をデータストアに作成します。
/// </summary>
/// <param name="user">ユーザー情報。</param>
/// <returns></returns>
public async Task CreateAsync(ApplicationUser user)
{
  var result = await userIds.Set(user.UserName, user.Id);
  if (result)
  {
    await users.Set(user.Id, user);
  }
}

 RedisHash<TKey>クラスのSetメソッドを呼び出し、userIds、usersハッシュにそれぞれ情報を登録します。Setメソッドの引数はRedisハッシュのfieldとvalueです。

 なお、usersハッシュのvalueに直接ApplicationUserオブジェクトを渡していますが、CloudStructuresの既定の動作により、JSON形式にシリアライズされてRedisに設定されます。

ユーザー取得処理

 データストアにRedisを使うようにしたため、前回作成したFindByNameAsyncメソッドも変更します(リスト5)。

リスト5 ユーザー取得処理(ApplicationUserStore.csより)
/// <summary>
/// ユーザー名を使いユーザーを検索します。
/// </summary>
/// <param name="userName">ユーザー名。</param>
/// <returns>見つかったユーザー情報。見つからない場合はnullを返す。</returns>
public async Task<ApplicationUser> FindByNameAsync(string userName)
{
  var id = await userIds.Get<string>(userName);
  if (id.HasValue)
  {
    var user = await users.Get<ApplicationUser>(id.Value);
    return user.HasValue ? user.Value : null;
  }
  else
  {
    return null;
  }
}

 RedisHash<TKey>クラスのGetメソッドを呼び出し、userIds、usersハッシュからユーザー情報を取得します。Getメソッドの引数は、Redisハッシュのfieldです。

 まずuserIdsハッシュからユーザー名に対応するIDを取得します。見つかったかどうかは、Getメソッドの戻り値のHasValueプロパティで判定できます。

 IDが取得できたら、今度は取得したIDを使いusersハッシュからユーザー情報を取得します。取得したIDの値はValueプロパティで取得できます。また、Getメソッドの型引数にAppliationUser型を指定することで、ユーザー情報を取得する際JSON形式からApplicationUserオブジェクトに自動的にデシリアライズされます。

次のページ
ユーザー登録画面

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

  • 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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー

アクセスランキング

アクセスランキング