心血來潮,將某個小專案的 ASP.NET Core 相關套件從 1.1 更新至 2.0,
更新套件看起來沒什麼問題,執行起來到有 [Authorize] 的 Action 前,立馬掛在 middleware next()...
出現的例外狀況的訊息
在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,就會出現類似例外錯誤訊息:
改成 public 修飾詞才能正常透過建構子注入,我以為是建構式參數的問題,浪費我不少時間找錯誤...