[ASP.NET Core] ASP.NET Core 1.1 升級至 ASP.NET Core 2.0 自訂驗證的問題

心血來潮,將某個小專案的 ASP.NET Core 相關套件從 1.1 更新至 2.0,

更新套件看起來沒什麼問題,執行起來到有 [Authorize] 的 Action 前,立馬掛在 middleware next()...

出現的例外狀況的訊息

No authenticationScheme was specified, and there was no DefaultChallengeScheme found

在1.1的時候,並不用設定 authenticationScheme 與 DefaultChallengeScheme 也能正常運作,

經過好幾次的 keyword 搜尋後,看到官方有提到 Migrating Authentication and Identity to ASP.NET Core 2.0

但我並不是用 Cookie-based、JWT Bearer、OpenID Connect (OIDC)、Facebook、Google、Microsoft Account、Twitter 等已經寫好的認證,

為了瞭解認證是怎麼實作的,我自己寫自訂驗證的,所以關鍵在於自訂驗證需要做什麼調整,

所以很快找到 ASP.NET Core 2.0 authentication middleware 相關的提問,

再回頭看 Migrating Authentication and Identity to ASP.NET Core 2.0

才發現 ASP.NET Core 2.0 的認證改定義在實作 AuthenticationHandler<> 的 HandleAuthenticateAsync 方法,

然後在 Startup/ConfigureServices 增加認證服務 AddAuthentication(),

同時 AddAuthentication() 回傳 AuthenticationBuilder 用來 AddScheme,註冊你實作好的 AuthenticationHandler<>,

最後在 Startup/Configure 使用認證 UseAuthentication() 就能完成新的 ASP.NET Core 2.0 認證方式,

其中要實作的類別,可以詳細看這篇 ASP.NET Core 2.0 authentication middleware,有最低需求的建置要點。

 

注意的是實作 AuthenticationHandler<> 時,如果是用 VS 快速動作與重構產生的建構子,

建構式預設會是 protected 修飾詞,在執行時 DI 會無法 Injection,就會出現類似例外錯誤訊息:

A suitable constructor for type 'xxx Type' could not be located. Ensure the type is concrete and services are registered for all parameters of a public constructor.

改成 public 修飾詞才能正常透過建構子注入,我以為是建構式參數的問題,浪費我不少時間找錯誤...