9
14

More than 3 years have passed since last update.

ASP.NET Core の認証周りのメモ

Last updated at Posted at 2020-05-29

.NET Core の認証周りのメモ

認証周りのところを少し読んでみたので備忘メモ

調べたバージョンはASP.NET Core 3.1

結論を先に書くとIAuthenticationHandler が一つのポイントとなっているようだ

登場するクラスメモ

AuthenticationMiddleware

ソース

Startup.csapp.UseAuthentication(); を実行することで有効化される。

前半部分の処理は不明ですが、
cookieなどから認証情報をとりだし HttpContext.User にセットしているようです。

試しに app.UseAuthentication(); をコメントアウトしたところ、認証情報が取得できず[Authorize] をつけているところははじかれる

AuthorizationMiddleware

ソース

Startup.csapp.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.csservice.AddMvc(), service.AddControllers(), services.AddControllersWithViews() などを実行すれば登録される。
これはMvcServiceCollectionExtensionsAddAuthorization が実行されているためである。

AddAuthorizationPolicyServiceCollectionExtensionsで定義されており
この中で呼びだしている services.AddAuthorizationCoreが登録を行っている

AddAuthorizationCoreAuthorizationServiceCollectionExtensionsで定義されており、ここで認証に関連するクラスが登録されている。

おわりに

ひとまず登場するクラス群とその流れについてメモを残しました。

9
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
14