ASP.NET 認証まわりメモ

メンバシップフレームワーク

メンバシップ プロバイダの実装
サンプル メンバシップ プロバイダの実装
方法 : サンプル メンバシップ プロバイダを実装する
方法 : カスタム メンバシップ ユーザーを実装する

DataSourceごとにプロバイダクラスを生成する必要がある。(DBのSQL方言など?)
プロバイダの実装例ではmdb(Access)をデータストアとしたプロバイダの実装例が掲載されている。

メンバシップユーザーの項目を追加する場合は、独自のユーザークラスを作成する必要がある。
また、それに伴いプロバイダクラスも拡張が必要になる。これらクラスのソースコードが一部抜粋して掲載されている。

メンバーシップによるチェックが成功した後の動き

Membership.ValidateUser()でユーザー名とパスワードの確認を行い、
パスするとFormsAuthenticationクラスを使用して認証処理を行う。
(ASP.NET MVCの場合は自動生成されるAccountControllerクラスのソースコードを参照。)

認証チケットとは

より
フォーム認証では、いったん認証されると認証チケットと呼ばれる資格情報がクッキーとしてクライアントへ送信される。 クライアントはこのクッキーを送信することで認証済みであることを示し、アプリケーションへアクセスすることができる。

認証チケット設定

認証チケット保存にCookieを使用するかWeb.configに指定しておく必要がある。
authentication/forms@cookieless 属性値に値をセットする。
ここで指定された値は、FormsAuthentication.CookieModeプロパティへセットされる。

※参照 FormsAuthentication.CookieMode プロパティ (System.Web.Security)
クッキーレスでの動作
Web.configのformsノードのcookieless属性値に"UseUri"を指定する。
<authentication mode="Forms">
  <forms loginUrl="~/Account/LogOn" timeout="2880" cookieless="UseUri" />
</authentication>


ログインするとURLが長くなる。これが認証チケット情報。


トップページではない別のページを表示。
"http://localhost/<認証チケット情報>/<以降のUrl>" となる。


認証チケット情報をUrlからはずすとログアウトしてしまう。
認証クッキー名の変更
Web.configのformsノードのname属性値に"test"を指定する。デフォルト値は".ASPXAUTH"
<authentication mode="Forms">
  <forms loginUrl="~/Account/LogOn" timeout="2880" name="test" />
</authentication>

認証クッキー名称がname属性値になる。

認証チケットの保存

FormsAuthentication.RedirectFromLoginPage()を呼び出すとチケットが発行され、
Cookieが有効な場合はCookieへ、無効な場合はHttpRequest.QueryStringプロパティへセットされる。
その後ページリダイレクトが発生する。

現在のログインユーザー情報をセットする

HttpモジュールのSystem.Web.Security.FormsAuthenticationModuleクラスが行う。
(C:\Windows\Microsoft.NET\ 以下にあるデフォルト設定のWeb.configで設定されている。)
認証チケットを復号してユーザー情報を生成、HttpContext.Userへセットする。

FormsAuthenticationModule クラス (System.Web.Security)

ユーザー情報(Principal)

System.Security.Principal.IPrincipalインターフェイス実装クラス。
Identityプロパティでユーザー情報2を返す。たいていはGenericPrincipalクラスが使用される?

IPrincipal インターフェイス (System.Security.Principal) GenericPrincipal クラス (System.Security.Principal)

ユーザー情報2(Identity)

System.Security.Principal.IIdentityインターフェイス実装クラス。
フォーム認証では、認証チケットからFormsIdentityオブジェクトを生成してユーザー情報にセット。
そしてHttpContext.Userへセットされる。

IIdentity インターフェイス (System.Security.Principal) FormsIdentity クラス (System.Web.Security)

PrincipalとIdentity

Principalはグループアカウント、Identityはユーザーアカウントだと考えることができる。詳しくは下記URLを参照。

プリンシパル オブジェクトと ID オブジェクト