概覽 現代應用程式看上去大都是這樣的: 最常見的交互是: 瀏覽器與Web應用程式通信 Web應用程式與Web API通信(有時是獨立的,有時是代表用戶的) 基於瀏覽器的應用程式與Web API通信 本機應用程式與Web API通信 基於伺服器的應用程式與Web API通信 Web API與Web A ...
概覽
現代應用程式看上去大都是這樣的:
最常見的交互是:
- 瀏覽器與Web應用程式通信
- Web應用程式與Web API通信(有時是獨立的,有時是代表用戶的)
- 基於瀏覽器的應用程式與Web API通信
- 本機應用程式與Web API通信
- 基於伺服器的應用程式與Web API通信
- Web API與Web API通信(有時是獨立的,有時是代表用戶的)
通常,每一層(前端,中間層和後端)都必須保護資源並實施身份驗證和/或授權-經常針對同一用戶存儲。
將這些基本安全功能外包給安全令牌服務可防止在那些應用程式和端點之間重覆該功能。
重組應用程式以支持安全令牌服務將導致以下體繫結構和協議:
這樣的設計將安全問題分為兩個部分:
身份認證
當應用程式需要知道當前用戶的身份時,需要進行身份驗證。通常,這些應用程式代表該用戶管理數據,並且需要確保該用戶只能訪問允許其訪問的數據。最常見的示例是(經典)Web應用程式,但是本機和基於JS的應用程式也需要身份驗證。
最常見的身份驗證協議是SAML2p,WS-Federation和OpenID Connect-SAML2p是最受歡迎和部署最廣泛的協議。
OpenID Connect是三者中的最新者,但被認為是未來,因為它在現代應用程式中具有最大的潛力。它從一開始就針對移動應用程式場景而構建,並旨在實現API友好。
API訪問
應用程式有兩種與API通信的基本方式-使用應用程式身份或委派用戶身份。有時兩種方法需要結合。
OAuth2是一種協議,允許應用程式從安全令牌服務請求訪問令牌並使用它們與API通信。由於可以集中身份驗證和授權,因此這種委派降低了客戶端應用程式和API的複雜性。
OpenID Connect和OAuth 2.0 –更好的結合在一起
OpenID Connect和OAuth 2.0非常相似-實際上,OpenID Connect是OAuth 2.0的擴展。身份驗證和API訪問這兩個基本的安全問題被組合成一個協議-通常只需一次往返於安全令牌服務。
我們相信OpenID Connect和OAuth 2.0的結合是在可預見的將來保護現代應用程式的最佳方法。IdentityServer4是這兩個協議的實現,並且經過高度優化,可以解決當今移動,本機和Web應用程式中的典型安全問題。
IdentityServer4如何提供幫助
IdentityServer是將符合規範的OpenID Connect和OAuth 2.0端點添加到任意ASP.NET Core應用程式的中間件。
通常,您構建(或重覆使用)包含登錄和註銷頁面(可能還需要您同意-取決於您的需要)的應用程式,IdentityServer中間件會向其中添加必要的協議頭,以便客戶端應用程式可以與之對話使用那些標準協議。
你可以根據你的需要使用儘可能複雜的宿主應用程式。但是,為了保持受攻擊面儘可能小, 我們一般建議你只將認證相關的UI包含進來。
相關術語
IdentityServer
IdentityServer 是一個 OpenID Connect 提供程式 —— 它實現了OpenID Connect 和 OAuth2 協議。
對於相同的角色,不同的文獻將使用不同的術語 —— 你可能也發現了安全令牌服務(Security Token Service),身份提供程式(Identity Provider),授權伺服器(Authorization Server),IP-STS 等等。但是他們都具相同的含義:軟體中用來向客戶端發行安全令牌的部分。
IdentityServer 包含一些職責和功能:
- 保護你的資源
- 使用本地賬戶存儲或外部的身份提供程式來進行用戶身份認證
- 提供會話管理和單點登錄(Single Sign-on)
- 客戶端管理和認證
- 給客戶端發行身份令牌和訪問令牌
- 驗證令牌
用戶
用戶是通過已註冊客戶端訪問相關數據的人。
客戶端
客戶端是軟體中從 IdentityServer 請求令牌(Token)的部分 —— 既可以是為了認證一個用戶(即請求的是 身份令牌),也可以是為了訪問一個資源(即請求的是 訪問令牌)。一個客戶端必須首先註冊到 IdentityServer 才能請求相關的令牌。
客戶端可以是Web應用程式、移動客戶端或桌面應用程式、單頁面應用程式(SPA,Single Page Application)、伺服器進程等等。
資源
資源就是你想要通過 IdentityServer 保護的東西 —— 既可以是你的用戶的 身份信息,也可以是 API。
每個資源都有唯一的名稱 —— 客戶端使用這些名稱來指定他們想要訪問的資源。
身份數據(Identity data) 是一個用戶的身份信息(又稱為 claims),比如 名字(name) 和 郵箱地址(email address)。
API 資源表示的是客戶端想要調用的功能 —— 通常通過 Web API 來對 API 資源建模,但這不是必須的。
身份令牌
一個身份令牌表示的是認證過程的輸出。它最低限度地標識了某個用戶(這也可以稱為主身份信息的子集,原文:Called the sub aka subject claim),還包含了用戶的認證時間和認證方式。身份令牌可以包含額外的身份數據。
訪問令牌
訪問令牌用來授予訪問某個 API 資源的許可權。客戶端請求訪問令牌,然後被導向 API。訪問令牌包含了客戶端和用戶(如果提供了的話)的相關信息,API通過這些信息來給它們授予數據訪問許可權。
參考:http://docs.identityserver.io/