ログオンの仕組み
リスト1ではユーザーの登録がされた後、IdentityHelperクラスのSignInメソッドを使い、ログオン処理を行っていましたね。このログオン処理は図4のようなイメージです。
今度はこのIdentityHelperクラスの実装を紐解いていきましょう。IdentityHelperクラスは、UserManagerクラスと同じIdentityModels.csファイルに定義されています(リスト3)。
public static class IdentityHelper { ... public static void SignIn(UserManager manager, ApplicationUser user, bool isPersistent) { IAuthenticationManager authenticationManager = HttpContext.Current.GetOwinContext().Authentication; //(1) authenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie); var identity = manager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie); //(2) authenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity); //(3) } ... }
(1)OWINの認証ミドルウェアを取得する
ASP.NET IdentityはOWINの認証ミドルウェアの上に構築されています。ログイン処理も当然この認証ミドルウェアを利用して行うことになります。
OWINを使うと、HTTPContextにOWIN用のコンテキストであるOWINContextが登録されます。この中に認証ミドルウェアの実体であるIAuthenticationoManagerオブジェクトが格納されているため、最初に取り出します。
なお、ASP.NET Identityでは、Cookie(クッキー)を利用した認証を行うCookieAuthenticationManagerクラスのオブジェクトが格納されています。
(2)認証用の識別情報を作成する
UserManagerクラスの拡張メソッドであるCreateIdentityメソッドを呼び出し、登録したユーザー情報から識別情報を作成します。この識別情報の実体はClaimsIdentityクラスのオブジェクトになっています。ClaimsIdentityの"Claims"部分は「クレーム」のことで、日本語では「要求」と訳されることが多いようです。認証する側が「要求」する「認証に必要な情報」を表していて、例えばユーザーIDなどを「クレーム」として登録した識別情報がClaimsIdentityです。ASP.NET Identityでは、ユーザーID、ユーザー名、識別情報のタイプ(ASP.NET Identityであることを示すタイプ)の3つのクレームを認証に使います。
(3)識別情報を使いログインする
(2)で作成した識別情報を使ってログインを行います。この処理では、渡された識別情報を含む認証用の「認証チケット」(AuthenticationTicket)が作成されます。この認証チケットは、HTTPレスポンスのCookieに暗号化して格納されます。
このようにして、ASP.NET Identityではログオン状態をCookieに保存します。そして、登録処理後のリダイレクト処理でクライアント処理からそのCookieが送信されるので、中に含まれる認証チケットを復号して内容を確認します。その結果、認証済みの正規の認証チケットであれば、認証チケットからユーザーの識別情報を取り出し、HTTPコンテキストのUserプロパティに設定します。そして、この識別情報がSite.Master.aspxなどで使用されてます(図5)。
なお、以上の動作のうち、識別情報と認証チケットの相互変換処理については、ASP.NET IdentityではなくOwinの認証用ミドルウェアの機能で行われます。その内部実装を詳しく知りたいのであれば、OwinのMicrosoftによるリファレンス実装であるKatana ProjectのMicrosoft.Owin.Security.AuthenticationManagerクラスやMicrosoft.Owin.Security.Infrastructure.AuthenticationHandlerクラス、AuthenticationHandler<TOptions>クラス、Microsoft.Owin.Security.Cookies.CookieAuthenticationHanderクラスといった関連クラスのソースコードより、その詳細な動作を確認できます。
- Microsoft.Owin.Security.AuthenticationManagerクラス - Katana Project
- Microsoft.Owin.Security.Infrastructure.AuthenticationHandlerクラス - Katana Project
- Microsoft.Owin.Security.Infrastructure.AuthenticationHandlerクラス - Katana Project
- Microsoft.Owin.Security.Cookies.CookieAuthenticationHanderクラス - Katana Project
まとめ
今回はVisual Studioによって生成されたサンプルコードの内部の動作に着目し、ASP.NET IdentityとOWINがどのように処理を行っているのかについて、説明しました。まとめると、次のようになります。
-
ユーザー情報の登録は次のようなクラスが関係している
- ApplicationUser:ユーザー情報
- UserStore<TUser>:ユーザー情報の保管、取り出しを行う
- ApplicationDbContext:SQL Serverに保管されたユーザー情報をEntity Frameworkで操作する
- UserManager:ユーザーのCRUDをはじめとした管理を行う
-
UserManagerクラスのCreate拡張メソッドを実行すると、次の処理が行われる
- ユーザー情報がSQL Serverに登録される
- ユーザーがログイン状態となる
-
ログイン状態の設定は次のようなクラスが関係している
- IdentityHelper:ASP.NET Identityのログイン処理などを補助する
- ClaimsIdentity:ユーザー情報を「クレーム」として保持する識別情報
- AuthenticationTicket:識別情報を保持する認証チケットで、Cookieに格納される
- 認証チケットが送られてくると、認証済みかどうか判断し、認証済みなら識別情報を取り出してHTTPコンテキストのUserプロパティに設定する
-
ログイン状態はASP.NET IdentityとOWINで分担して扱う
- ASP.NET Identity:ユーザー情報から識別情報を作成する
- OWIN:識別情報から認証チケットに変換しCookieへの出し入れを行う
次回はユーザー情報に独自の項目を追加する方法について紹介する予定です。お楽しみに。