Hero Image
[.NET Core] ASP .NET Core 3.1 驗證與授權(二)-驗證設定

驗證方案(Authentication Scheme) 驗證方案包含兩個部分: 驗證處理函式(Authentication handler),可能是 IAuthenticationHandler 或 AuthenticationHandler 的實作,相當於驗證方案的行為,責任範圍涵蓋: 驗證使用者, 驗證成功時,建構呈現使用者識別(user identity)的 AuthenticationTicket。 驗證失敗時,回傳 ’no result’ 或 ‘failure’ 負責從請求上下文(request context)中建構使用者識別 (user identity)。 定義了 challenge/forbid action。 驗證處理函式的設定選項(Opitons of Authentication handler)。 驗證方案當中的 authencate action 負責從請求上下文(request context)中建構使用者識別 (user identity), 常見的例子為: cookie authentication scheme 從 cookie 資訊建構 user identity. JWT bearer scheme 反序列化(deserialize)、驗證(validate) token,並從 token 所攜帶資訊建構 user identity 使用驗證方案 在 Startup.ConfigureServices 以 AddAuthentication 註冊驗證服務時會回傳一個 AuthenticationBuilder, AuthenticationBuilder 設定驗證方案的方式有: 呼叫 scheme-specific 擴充方法,例如 AddJwtBearer、AddCookie,這些擴充方法會自動呼叫 AuthenticationBuilder.AddScheme 設定需要的驗證方式。 以 AuthenticationBuilder 內建方法 AddScheme 手動設定,一般來說較少使用。 P.S.另外可使用 polycy schemes 把多個 scheme 整合到一個使用。

Hero Image
[.NET Core] ASP .NET Core 3.1 驗證與授權(三)-Cookie 驗證實例

前兩篇介紹了驗證、授權在 .NET Core 當中的基本的概念,本節實作 Cookie 驗證的設定、簽發、登出… Configuration 在 Startup.ConfigureServices 方法中設置驗證方案, 並且可以在 AddCookie 當中設置 CookieAuthenticationOptions(見前一節) // 設置 cookie 驗證作為應用程式預設的驗證方案 services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) // 將 cookie 服務添加到服務容器當中 .AddCookie(); 在 Startup.Configure 方法中,呼叫 UseAuthentication、UseAuthorization, 啟用驗證中間件並設置 HttpContext.User 屬性, UseAuthentication 必須在 UseAuthorization 之前,且兩者都必須在 UseEndpoints 之前被呼叫: app.UseAuthentication(); // 驗證 app.UseAuthorization(); // 授權 // 端點對應 app.UseEndpoints(endpoints => { endpoints.MapControllers(); endpoints.MapRazorPages(); }); Cookie Policy Middleware 在中間件當中設置的驗證政策會作用於全域(每個請求), 舉例來說,最常用的就是限制應用程式所有 Cookie 的 SameSite 屬性, 所有 Controller 簽發的 Cookie.SamSite 屬性會被限縮為較嚴格(不比 MinimumSameSitePolicy 寬鬆)的設置: app.UseCookiePolicy(new CookiePolicyOptions { // 所有 Cookie.SamSite 設置都會被提升為 Strict MinimumSameSitePolicy = SameSiteMode.Strict, // Cookie.SamSite 設置為 None 的話會被提升為 Lax //MinimumSameSitePolicy = SameSiteMode.Lax, // MinimumSameSitePolicy 設置為最寬鬆,因此不會影響 Cookie.SamSite //MinimumSameSitePolicy = SameSiteMode.None, }); Create an authentication cookie .NET Core 利用 ClaimsPrincipal 將序列化的使用者資訊儲存在 Cookie 當中 而 ClaimsPrincipal 可包含很多 ClaimsIdentity(但通常只有一個); ClaimsIdentity 可以且通常包含很多 Claims(聲明), 而每個 Claims 是包含型別(ClaimType)、值(ClaimValue)。 因此為登入使用者建立 Cookie 驗證的步驟如下:

Hero Image
[.NET Core] ASP .NET Core 3.1 驗證與授權(一)-驗證與授權

在進入 ASP .NET Core 3.1 中驗證(Authentication)與授權(Authorization)的作用流程前,應當對兩者有抽象概念上的認識,以及了解兩者的差異。 驗證(Authentication) 驗證是確認用戶識別碼(User Identity)的程序,通過驗證的用戶可具有一或多個用戶識別碼, 因此驗證服務本身就是使用者識別碼提供者 (User Identity Provider), ASP.NET Core 3.1 當中以依賴注入(DI; Dependency Injection)將驗證服務注入服務容器 (Service Container), 使應用程式驗證簽發時能夠取用。 授權(Authorization) 授權的作用是界定用戶可存取資源範圍,作用描述如下: 限制所存取的資源是否需要驗證。 已獲得驗證的特定用戶、特定腳色方能存取特定資源。 所存取的資源需要以何種授權政策(Authorizaton Policy)、即驗證方案(Authencation Scheme)。 挑戰和禁止 有些名詞需要先解釋: 驗證方案(Authentication Scheme)當中設置了挑戰(Chellange)與禁止(Forbid)應該進行的動作,這些註冊於驗證方案的動作動作由授權叫用。 挑戰(Challenge) 未驗證使用者要存取需驗證才能存取的資源時, 授權服務會叫用 IAuthenticationService.ChallengeAsync 發起 challenge, challenge 被發起後所伴隨採取的行動稱為 challenge action, 且 challenge action 應讓使用者知道應該以哪一種驗證機制取得授權,常見的具體範例有: cookie 驗證方案將使用者轉址到登入頁面。 JWT 回傳 401 Unauthorized 狀態碼,並在 Header 帶入 www-authenticate: bearer。 禁止(Forbid) 已驗證的使用者要存取授權之外的資源時, 授權會叫用 IAuthenticationService.ForbidAsync 發起 Forbid, Forbid 發起後所伴隨採取的行動稱為 Forbid action, Forbid action 的目的是要讓使用者知道自己已通過認證、且不具權限訪問所請求的資源, 常見的具體範例有: