独自認証処理の組み込み
最後に認証処理を各所に組み込んでいきます。認証処理のコードはほぼテンプレートと変わりませんので、ここではポイントを絞ってコードを示します。完全なコードはサンプルコードを直接参照してください。
Startupクラス
Cookie認証を行うためのOWINミドルウェアを登録する、Startupクラスを作成します。Configurationメソッドを定義し、その中でUserCookieAuthenticationメソッドを呼び出します(リスト5)。引数のCookieAuthenticationOptions型オブジェクトのLoginPathプロパティには、未認証の状態で認証が必要なページにアクセスしたときに表示するログインページのURLを指定します。
// Cookie認証を行う app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString("/Login") });
Loginページ
ログインを行うため、ユーザー名とパスワードを入力させるLoginページを作成します。
まずログイン処理の最初に、画面で入力されたユーザー名とパスワードを使い、ApplicationUserManagerオブジェクトのFind拡張メソッドを呼び出して、ユーザー名、パスワードの検証を行います(リスト6)。
// ユーザー名とパスワードを検証 var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>(); var user = manager.Find(userName.Text, password.Text); if (user == null) { return; }
ユーザー名、パスワードの検証に成功したら、取得したユーザー情報(ApplicationUserオブジェクト)から識別情報(ClaimsIdentityオブジェクト)を作成し、AuthenticationManagerオブジェクトのSignInメソッドに渡すことでログイン処理を行います(リスト7)。
// ユーザーの識別情報を作成し、ログインする 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を列挙子を指定します。
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メソッドを呼び出し、ログアウト処理を行う
-
OWINのStartupクラス
次回はSQL Server以外のデータストアを使って独自にユーザー情報を管理する方法について紹介する予定です。お楽しみに。