問題
最近開發的系統,因為要認證要走 SAML SSO ,而且系統又是前後端分離(react, asp.net core)。
所以在個人環境開發時,測試程式時,都需要導到 SSO Server 後,再導回來才能進行測試。
來來回回的,蠻花時間的,那有沒有辦法不需要每次都去找 SSO 驗證,才能進行測試呢?
解法
一開始參考Creating an authentication scheme in ASP.NET Core 2.0這個方式,
將使用者的相關Claims記錄到appsettings.json之中,後端有檢查到設定值,就依Claims進行登入。
但在測試過程中發現,這種方式在啟用這種驗證時,其他的驗證方式無法同時並用(會導致其他驗證方式失效)。
所以就參考 ApiKeyAuthorizationMiddleware.cs 使用 Middleware 的方式,
就可以跟原本的驗證方式並用(不會影響到原本的登入驗證)。以下就來進行實作,
1.在 appsettings.json 設定要驗證的相關資料
Session 名稱為 Dev.Local,可設定是否Enable(預設為 true),也可以改變AuthenticationType(預設為Dev.Local),如下,
| 1 | { | 
2.依 appsettings.json 產生 ClaimsPrincipal
| 1 | public static class DevAuthenticationDefaults | 
| 1 | public static class DevAuthenticationExtensions | 
3.建立 middleware 來設定 User
| 1 | public class DevLocalAuthMiddleware | 
4.在 app.UseAuthorization(); 前加入使用 DevLocalAuthMiddleware 這個 middleware
| 1 | // ... | 
ASP.NET Core Razor Page 測試
在appsettings.json加入需要的內容,並在program.cs 加入app.UseMiddleware<DevLocalAuthMiddleware>();,
可以在Index.cshtml.cs中發現User.Identity已是登入狀態。
 
但頁面卻沒有顯示登入者的資訊,
那是因為預設它會判斷ClaimsIdentity中的AuthenticationType的值要為Identity.Application才會認為有登入。
所以可以在appsettings.json中設定AuthenticationType值為Identity.Application,如下,
| 1 | { | 
再跑一次程式,UI 就會是登入狀態了。
 
相關程式碼請參考: DevLocalAuthentication
如果想要直接使用,也可以直接安裝 DevLocalAuthentication Nuget 套件
參考資源
Creating an authentication scheme in ASP.NET Core 2.0
DevLocalAuthentication 程式碼
ApiKeyAuthorizationMiddleware.cs
一本、二店、三和氣: 做生意第一要資本;第二地點要適合,門面要修飾;第三要對人和氣,是生意興隆之道。