適用於雲端原生應用程式的 IdentityServer
IdentityServer 是一種驗證伺服器,可實作 ASP.NET Core 的 OpenID Connect (OIDC) 和 OAuth 2.0 標準。 其設計目的是要提供對所有應用程式驗證要求的通用方法,無論是 Web、原生、行動或 API 端點。 IdentityServer 可用來針對多個應用程式和應用程式類型實作單一登入 (SSO)。 它可以透過登入表單和類似的使用者介面來驗證實際使用者,以及通常涉及權杖發行、驗證和更新的服務型驗證,而不需要任何使用者介面。 IdentityServer 的設計目的是要成為可自訂的解決方案。 一般而言,每個執行個體會加以自訂,以符合個別組織及/或一組應用程式的需求。
常見的 Web 應用程式案例
一般而言,應用程式需要支援下列部分或所有案例:
- 使用瀏覽器存取 Web 應用程式的人類使用者。
- 從瀏覽器型應用程式存取後端 Web API 的人類使用者。
- 行動/原生用戶端上存取後端 Web API 的人類使用者。
- 其他存取後端 Web API 的應用程式 (不需作用中使用者或使用者介面)。
- 任何應用程式可能需要使用自己的身分識別或委派給使用者的身分識別,與其他 Web API 互動。
圖 8-1: 應用程式類型和案例。
在上述每個案例中,都必須保護公開的功能以避免未經授權的使用。 這至少需要驗證提出資源要求的使用者或主體。 此驗證可能會使用數個常見的通訊協定之一,例如 SAML2p、WS-Fed 或 OpenID Connect。 與 API 通訊通常會使用 OAuth2 通訊協定及其對安全性權杖的支援。 區分這些重要的跨領域安全性考量及其實作詳細資料與應用程式本身,可確保一致性並改善安全性和可維護性。 將這些考量外包給 IdentityServer 等專用產品,可協助每個應用程式自行解決問題的需求。
IdentityServer 提供在 ASP.NET Core 應用程式中執行的中介軟體,並新增 OpenID Connect 和 OAuth2 的支援 (請參閱支援的規格)。 組織會使用 IdentityServer 中介軟體建立自己的 ASP.NET Core 應用程式,以作為其所有權杖型安全性通訊協定的 STS。 IdentityServer 中介軟體會公開端點以支援標準功能,包括:
- 授權 (驗證終端使用者)
- 權杖 (以程式設計方式要求權杖)
- 探索 (伺服器的相關中繼資料)
- 使用者資訊 (利用有效存取權杖取得使用者資訊)
- 裝置授權 (用來啟動裝置流程授權)
- 自我檢查 (權杖驗證)
- 撤銷 (權杖撤銷)
- 結束工作階段 (觸發所有應用程式的單一登出)
開始使用
IdentityServer4 可在雙重授權下取得:
- RPL - 可讓您在開放原始碼工作中使用免費版 IdentityServer4
- 付費 - 可讓您在商業案例中使用 IdentityServer4
如需定價的詳細資訊,請參閱官方產品的定價頁面。
您可以使用其 NuGet 套件,將它新增至您的應用程式。 主要套件是 IdentityServer4,其已下載超過四百萬次。 基底套件不包含任何使用者介面程式碼,而且只支援記憶體內部組態。 若要搭配資料庫使用,您也需要 IdentityServer4.EntityFramework 之類的資料提供者,其會使用 Entity Framework Core 來儲存 IdentityServer 的組態和操作資料。 針對使用者介面,您可以將檔案從快速入門 UI 存放庫複製到 ASP.NET Core MVC 應用程式,以新增使用 IdentityServer 中介軟體登入和登出的支援。
組態
IdentityServer 支援不同類型的通訊協定和社交驗證提供者,這些提供者可以作為每個自訂安裝的一部分進行設定。 這通常會在 ASP.NET Core 應用程式的 Program
類別 (或在 ConfigureServices
方法的 Startup
類別中) 完成。 組態牽涉到指定支援的通訊協定,以及未來將使用之伺服器和端點的路徑。 圖 8-2 顯示從 IdentityServer4 快速入門 UI 專案取得的範例設定:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
// some details omitted
services.AddIdentityServer();
services.AddAuthentication()
.AddGoogle("Google", options =>
{
options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
options.ClientId = "<insert here>";
options.ClientSecret = "<insert here>";
})
.AddOpenIdConnect("demoidsrv", "IdentityServer", options =>
{
options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
options.SignOutScheme = IdentityServerConstants.SignoutScheme;
options.Authority = "https://demo.identityserver.io/";
options.ClientId = "implicit";
options.ResponseType = "id_token";
options.SaveTokens = true;
options.CallbackPath = new PathString("/signin-idsrv");
options.SignedOutCallbackPath = new PathString("/signout-callback-idsrv");
options.RemoteSignOutPath = new PathString("/signout-idsrv");
options.TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = "name",
RoleClaimType = "role"
};
});
}
}
圖 8-2: 設定 IdentityServer。
JavaScript 用戶端
許多雲端原生應用程式會在前端上,使用伺服器端 API 和豐富的用戶端單頁應用程式 (SPA)。 IdentityServer 會透過 NPM 提供 JavaScript 用戶端 (oidc-client.js
),這些用戶端可以新增至 SPA,讓它們能夠使用 IdentityServer 進行 Web API 的登入、登出和權杖型驗證。