SHOEISHA iD

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

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

ASP.NET Identity入門

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

ASP.NET Identity入門 第12回


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

独自認証処理の組み込み

 最後に認証処理を各所に組み込んでいきます。認証処理のコードはほぼテンプレートと変わりませんので、ここではポイントを絞ってコードを示します。完全なコードはサンプルコードを直接参照してください。

Startupクラス

 Cookie認証を行うためのOWINミドルウェアを登録する、Startupクラスを作成します。Configurationメソッドを定義し、その中でUserCookieAuthenticationメソッドを呼び出します(リスト5)。引数のCookieAuthenticationOptions型オブジェクトのLoginPathプロパティには、未認証の状態で認証が必要なページにアクセスしたときに表示するログインページのURLを指定します。

リスト5 Cookie認証OWINミドルウェア登録(Startup.csより)
// Cookie認証を行う
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
  AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
  LoginPath = new PathString("/Login")
});

Loginページ

 ログインを行うため、ユーザー名とパスワードを入力させるLoginページを作成します。

 まずログイン処理の最初に、画面で入力されたユーザー名とパスワードを使い、ApplicationUserManagerオブジェクトのFind拡張メソッドを呼び出して、ユーザー名、パスワードの検証を行います(リスト6)。

リスト6 ユーザー名とパスワードの検証(Login.aspx.csより)
// ユーザー名とパスワードを検証
var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
var user = manager.Find(userName.Text, password.Text);
if (user == null)
{
  return;
}

 ユーザー名、パスワードの検証に成功したら、取得したユーザー情報(ApplicationUserオブジェクト)から識別情報(ClaimsIdentityオブジェクト)を作成し、AuthenticationManagerオブジェクトのSignInメソッドに渡すことでログイン処理を行います(リスト7)。

リスト7 ログイン処理(Login.aspx.csより)
// ユーザーの識別情報を作成し、ログインする
var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
var identity = manager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie);
authenticationManager.SignIn(identity);

 以後のアクセスでは、ASP.NET IdentityによりCookieから自動的に識別情報が取得され、HttpContext.Userプロパティに設定されます。この辺りの挙動は第2回の解説を参考にしてください。

Site.Masterマスターページ

 マスターページにLoginStatusコントロールを配置し、ログイン状態の表示と、ログアウト処理を行います。

 LoginStatusコントロールのLoggingOutイベントハンドラーでは、OWINコンテキストに登録されたAuthenticationManagerオブジェクトを取り出し、SignOutメソッドを呼び出してログアウト処理を行います(リスト8)。引数にはCookie認証であることを表すDefaultAuthenticationTypes列挙体のApplicationCookieを列挙子を指定します。

リスト8 ログアウト処理(Site.Master.csより)
protected void LoginStatus1_LoggingOut(object sender, LoginCancelEventArgs e)
{
  // ログアウトする
  var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
  authenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
}

 以上で主要な実装は終わりです。この他にホームページとなるDefault.aspx、ログイン後のみ参照可能なページとしてMembers/Member.aspx、そしてその認証処理を記載したMembers/Web.configファイルなどを作成します。詳しくはダウンロードできるサンプルを参照してください。

まとめ

 ASP.NET Identityで独自の認証を行う方法について紹介してきました。案外簡単に実装できることが確認できたのではないかと思います。今回の内容をまとめると次のようになります。

  • 独自認証を行う際の最低限必要なNuGetパッケージは次の2つ
    • Microsoft.AspNet.Identity.Owin:OWINと連携して認証処理を行うためのライブラリ群
    • Microsoft.Owin.Host.SystemWeb:OWINをIISでホストするためのライブラリ群
  • 独自認証では次のクラス群を作成する
    • IUser<out TKey>インターフェースを実装したユーザークラス
    • IUserStore<TUser>, IUserPassword<TUser>インターフェースを実装したユーザーストアクラス
      • FindByNameAsyncメソッド:ユーザー名を使ってユーザー情報を取得する
      • GetPasswordHashメソッド:ユーザー情報よりパスワードのハッシュ値を取得する
    • ユーザークラスとユーザーストアクラスを利用するようにしたUserManger<TUser>クラスの派生クラス
  • 認証処理を組み込むには次の実装を行う
    • OWINのStartupクラス
      • Cookie認証を行うためのOWINミドルウェアを登録する
    • ログイン処理
      • UserManager<TUser>クラスの派生クラスを用いてユーザー名、パスワードを検証する
      • ユーザー情報より識別情報としてClaimsIdenitityオブジェクトを作成する
      • AuthenticationManagerクラスのSignInメソッドに識別情報を渡して呼び出し、ログイン処理を行う
    • ログアウト処理
      • AuthenticationManagerクラスのSignOutメソッドを呼び出し、ログアウト処理を行う

 次回はSQL Server以外のデータストアを使って独自にユーザー情報を管理する方法について紹介する予定です。お楽しみに。

参考資料

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

  • 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/8868 2015/08/26 09:02

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング