.NET Core の認証周りのメモ
認証周りのところを少し読んでみたので備忘メモ
調べたバージョンはASP.NET Core 3.1
結論を先に書くとIAuthenticationHandler が一つのポイントとなっているようだ
登場するクラスメモ
AuthenticationMiddleware
Startup.cs でapp.UseAuthentication(); を実行することで有効化される。
前半部分の処理は不明ですが、
cookieなどから認証情報をとりだし HttpContext.User にセットしているようです。
試しに app.UseAuthentication(); をコメントアウトしたところ、認証情報が取得できず[Authorize] をつけているところははじかれる
AuthorizationMiddleware
Startup.cs でapp.UseAuthorization(); を実行することで有効化される。
前述のapp.UseAuthentication(); の結果を利用するのでその後に呼び出す必要がある。
[Authorize] 属性をつけているとここで 認可の処理が実行されるようだ。
([Authorize] 属性はフィルターではないが IAuthorizeData を実装している)
[AllowAnonymous] が付与されていると次で述べるチェックが行われないような感じ。
認可のチェックはIPolicyEvaluator によって実行される。
この結果によって、チャレンジが必要ならHttpContext.ChallengeAsync を実行し、禁止されているならHttpContext.ForbidAsync を呼んでいるようである。
IPolicyEvaluator
ここでは実装クラスPolicyEvaluator のメモを書く
AuthorizationMiddleware で呼ばれた AuthorizeAsync メソッドでは IAuthorizationService.AuthorizeAsync に処理を委譲し、その結果によって「成功」「チャレンジが必要(ログイン画面へのリダイレクトなど)」「禁止」などの結果を返している
IAuthorizationService
ここでは実装クラスDefaultAuthorizationService のメモを書く
IAuthorizationHandler あたりに認可の処理を委譲してる感じかな?(わかんね)
そしてその結果を返している。
AuthenticationHttpContextExtensions
上記のミドルウェアなどからHttpContext のメソッドを呼び出しているが、これらは拡張メソッドとして定義されており、DIコンテナから取得したインスタンスに処理を委譲しているだけのようだ。
オーバーロードがされているが、整理すると以下のものになる。
- AuthenticateAsync
- ChallengeAsync
- ForbidAsync
- SignInAsync
- SignOutAsync
- GetTokenAsync
これらのメソッドはいずれもコンテナから IAuthenticationService を取得し、同名のメソッドを実行している。
IAuthenticationService
ここでは実装クラスAuthenticationService のメモを書く
いずれも差はあれど
- スキーマ名が渡されていなければ、
IAuthenticationSchemeProviderから対象のスキーマ名を取得 -
IAuthenticationHandlerProviderからスキーマ名に対応したIAuthenticationHandlerを取得 - 取得した
IAuthenticationHandlerに処理を委譲
となっている。
SignInAsync, SignOutAsync は選ばれたハンドラーがそれぞれに対応したインターフェースを実装している必要があるようだ。
IAuthenticationHandler
認証関係の処理の到達先がここになっている。
これは認証方法によって様々な実装クラスが用意されている。
Cookie 認証の場合だと CookieAuthenticationHandlerになる
DIコンテナに関連するクラスを登録する方法
認証関係
認証に関連するものはStartup.csで
services.AddAuthentication() を実行すればよい
呼び出し先はAuthenticationServiceCollectionExtensions
この中でもservices.AddAuthenticationCore() メソッド
呼び出し先はAuthenticationCoreServiceCollectionExtensions
で認証に関連するクラスが登録されている。
個別の認証を定義するには
services.AddAuthentication(option =>
{
option.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie()
;
のようにAddAuthentication に続けて書く
.NET Identity でもIdentityServiceCollectionExtensions の中で上記の事が行われており、さらに追加のクラスが登録されているようです。
認可関係
認可に関連するものはStartup.cs でservice.AddMvc(), service.AddControllers(), services.AddControllersWithViews() などを実行すれば登録される。
これはMvcServiceCollectionExtensions でAddAuthorization が実行されているためである。
AddAuthorization はPolicyServiceCollectionExtensionsで定義されており
この中で呼びだしている services.AddAuthorizationCoreが登録を行っている
AddAuthorizationCore はAuthorizationServiceCollectionExtensionsで定義されており、ここで認証に関連するクラスが登録されている。
おわりに
ひとまず登場するクラス群とその流れについてメモを残しました。