SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

ASP.NET Identity入門

ASP.NET Identityで独自の認証処理を行う

ASP.NET Identity入門 第12回


ユーザー型の作成

 次に、ユーザー情報を保持するユーザー型を、IUser<out TKey>インターフェースを実装して作成します(リスト1)。今回はカスタマイズのわかりやすさを考慮し、最小限の情報を持つユーザー型ApplicationUserを作成します。

リスト1 ユーザー型(Identities/ApplicationUser.csより)
/// <summary>
/// ユーザー情報を管理します
/// </summary>
public class ApplicationUser : IUser<string>
{
  /// <summary>
  /// ユーザーを識別するためのキーです。
  /// </summary>
  public string Id { get; private set; }

  /// <summary>
  /// ユーザーの名前です。
  /// </summary>
  public string UserName { get; set; }

  /// <summary>
  /// ユーザーのパスワードのハッシュ値です。
  /// </summary>
  public string PasswordHash { get; set; }

  /// <summary>
  /// Id を使用して ApplicationUser クラスの新しいインスタンスを生成します。
  /// </summary>
  /// <param name="id"></param>
  public ApplicationUser(string id)
  {
    this.Id = id;
  }
}

 今回のサンプルではIUserインターフェースの型引数にstring型を指定することで、ユーザーのIDの型を文字列型にしています。

ユーザー管理用クラスの作成

 今度はユーザー情報を扱うための処理を行うクラス群を作成していきます。

ユーザー情報の出し入れを行うApplicationUserStore型

 データストアを使いユーザー情報の出し入れを行うための型であるApplicationUserStore型を、IUserStore<TUser>、IUserPasswordStore<TUser>インターフェースを実装して作成します(リスト2)。

リスト2 ApplicationUserStoreクラス(Identities/ApplicationUserStore.csより)
/// <summary>
/// ユーザーの管理用APIを提供します。
/// </summary>
public class ApplicationUserStore :
  IUserStore<ApplicationUser>,          // (1)
  IUserPasswordStore<ApplicationUser>   // (2)
{
  ...

  /// <summary>
  /// ユーザー名を使いユーザーを検索します。
  /// </summary>
  /// <param name="userName">ユーザー名。</param>
  /// <returns>見つかったユーザー情報。見つからない場合はnullを返す。</returns>
  public Task<ApplicationUser> FindByNameAsync(string userName)  // (3)
  {
    // ここで外部サービス等からユーザー情報を取得する
    var hasher = new PasswordHasher();
    var user = new ApplicationUser(Guid.NewGuid().ToString())
    {
      UserName = userName,
      PasswordHash = hasher.HashPassword("123456")
    };
    return Task.FromResult(user);
  }

  ...

  public void Dispose() // (4)
  {
  }

  ...

  /// <summary>
  /// ユーザーのハッシュ処理されたパスワードを取得します。
  /// </summary>
  /// <param name="user">ユーザー情報。</param>
  /// <returns>ユーザーのハッシュ処理されたパスワード。</returns>
  public Task<string> GetPasswordHashAsync(ApplicationUser user)  // (5)
  {
    return Task.FromResult(user.PasswordHash);
  }

  ...

}

(1)IUserStore<ApllicationUser>インターフェースの実装

 ApplicationUser型のユーザー情報を扱うメソッド群(API)を提供するIUserStoreインターフェースを実装します。

(2)IUserPasswordStore<ApplicationUser>インターフェースの実装

 ユーザーのパスワードを扱うAPIを提供するIUserPasswordStoreインターフェースを実装します。

(3)ユーザー情報取得メソッド実装

 ユーザー名からユーザー情報を取得するためのIUserStore<TUser>.FindByNameAsync非同期メソッドを実装します。今回は認証処理の流れが分かればよいので、新たなユーザー情報をパスワード"123456"として作成して返します。なお、非同期メソッドなので、戻り値がTask<T>型であることに注意します。

(4)Disposeメソッド実装

 ApplicationUserStore型は外部のデータストアとやり取りすることが前提なので、必要ならDisposeメソッドを実装してアンマネージオブジェクトの破棄を行います。今回は空のままとしています。

(5)パスワードハッシュ値取得メソッド実装

 ユーザー情報のパスワードのハッシュ値を取得するためのIUserPasswordStore.GetPasswordHashAsyncm非同期メソッドを実装します。今回は簡単にするため、引数のApplicationUserオブジェクトより、PasswordHashプロパティを非同期に返します。

 IUserStore<TUser>、IUserPasswordStore<TUser>インターフェースには上記以外にも多くのメソッドが用意されていますが、今回の範囲では使用しないので、次のようにNotImplementedExceptionをスローするようにしておきます(リスト3)。

リスト3 未実装メソッドの扱い(Identities/ApplicationUserStore.cs より)
    public Task CreateAsync(ApplicationUser user)
    {
      throw new NotImplementedException();
    }

ユーザー管理処理を指示するApplicationUserManagerクラス

 ApplicationUserStoreクラスを使い、実際にユーザー管理処理の指示を行うApplicationUserManagerクラスを作成します(リスト4)。

リスト4 ApplicationUserManagerクラス(Identities/ApplicationUserManager.csより)
/// <summary>
/// UserStoreを使ったユーザー情報管理を自動化したAPIを提供します。
/// </summary>
public class ApplicationUserManager : UserManager<ApplicationUser>  // (1)
{
  /// <summary>
  /// UserStoreを使用して ApplicationUserManager クラスの新しいインスタンスを生成します。
  /// </summary>
  /// <param name="store"></param>
  public ApplicationUserManager(IUserStore<ApplicationUser> store)
    : base(store)
  {
  }

  /// <summary>
  /// ApplicationUserManager クラスのインスタンスを作成します。
  /// </summary>
  /// <param name="options"></param>
  /// <param name="context"></param>
  /// <returns></returns>
  public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
  {
    var manager = new ApplicationUserManager(new ApplicationUserStore());  // (2)
    return manager;
  }
}

(1)UserManager<TUser>クラスを継承する

 UserStoreクラスを使った各種処理を行うため、UserManager<TUser>クラスを継承して定義します。

 (2)UserManagerクラスのインスタンスを作成する

引数にApplicatonUserStoreオブジェクトを渡して、新しいApplicationUserManagerクラスのインスタンスを作成します。

次のページ
独自認証処理の組み込み

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

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本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

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

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

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

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/8868 2015/08/26 09:02

イベント

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

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

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

メールバックナンバー