.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で定義されており、ここで認証に関連するクラスが登録されている。
おわりに
ひとまず登場するクラス群とその流れについてメモを残しました。