問題
最近開發的系統,因為要認證要走 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
一本、二店、三和氣: 做生意第一要資本;第二地點要適合,門面要修飾;第三要對人和氣,是生意興隆之道。