以下思路參考于 IdentityServer4 源碼,流程。閱讀文章請 先 熟悉 OAuth 2.0, Open ID ,Open ID Connect 。本文章已申請授權騎士處理,轉載請注明出處。
存儲于 本機 Markdown文檔。 | 待更新。
IdentityServer4是一個針對 ASP.NET Core 2.0 的OpenID Connect 和 OAuth 2.0框架。
在你的應用中,它支持以下特性:
Authentication as a Service
所有應用程序的集中登錄邏輯和工作流(web,native,mobile,services),IdentityServer 是一個官方認證的OpenID Connect的實現。
Single Sign-on / Sign-out
在多個應用程序類型的登入和登出
Access Control for APIs
為不同的客戶端提供api的訪問令牌,e.g. server to server, web 應用,SPAs和 native .mobile apps
Federation Gateway(聯合網關)
支持如Azure AD,Google,Facebook等外部的身份驗證提供者,這將保護你的應用程序從如何連接到這些外部提供程序的細節。
Focus on Customization(專注于定制)
最重要的一部分--IdentityServer 的很多方面都可以定制,以滿足你的需求,由于IdentityServer 是一個框架,而不是一個boxed product或者一個SaaS,所以你可以編寫代碼來對系統進行調整,以適應您的場景。
Mature Open Source(成熟的開源)
IdentityServer 使用了Apache 2的開源許可,允許在它上面構建商業產品,它也是.NET Foundation的一部分,提供了法律支持和治理。
Free and Commercial Support(免費和商業支持)
如果你需要幫助構建或運行您的身份平臺,請讓我們知道,我們有幾種方法可以幫組你。
The Big Picture
大多數現代應用程序或多或少都是這樣的:
最常見的互動是:
瀏覽器與Web 應用程序的通信
Web應用程序與Web api進行通信(有時是自己的,也有代表用戶的)
基于瀏覽器的應用程序與web apis通信
Native applications 與 web APIs通信
基于服務器的應用程序與Web api通信
web api 與web api 進行通信(有時是自己的,有時代表用戶)
通常,每個層(前端,中間層和后端)都必須保護資源,并實現身份驗證/或授權 --通常是針對同一個用戶存儲的。
將這些基本安全功能外包給安全令牌服務,可以防止在這些應用程序和端點之間復制該功能,
對應用程序進行重構以支持安全令牌服務,這將導致以下體系和協議:
這樣的設計將安全問題分為兩部分:
Authentication
當應用程序需要了解當前用戶的身份時,需要進行身份驗證。通常,這些應用程序為了去管理數據和需要去確保這個用戶能被與允許連接這些數據。最常見的例子就是web 應用程序,但是是基于native和JS的應用程序也需要去進行身份驗證。
OpenID Connect是最新的三個,但它被認為是未來,因為它對現代應用最有潛力。它是為移動應用場景而建的,從開始和設計也是友好的和API。
API Access
應用程序有兩種基本的方式與API進行通信。使用application identity,或者委托user’s identity。有時這兩種方法需要結合使用。
OAurh2 是一種協議,允許應用程序從安全令牌服務請求訪問令牌,并使用它們與api進行通信,這個委托減少了客戶端應用程序和身份驗證和身份驗證之后的api復雜性。
OpenID Connect and OAuth 2.0 – better together
OpenID Connect 和OAuth 2.o非常相似--實際上,OpenID Connect 是OAuth2.0的一個擴展,兩個基本的安全問題,身份驗證和API訪問,被組合成一個單一的協議--通常是對安全令牌服務進行一次單獨的訪問。
我們相信,在可預見的未來,OpenID Connect和OAuth2.0的結合是確保現代應用程序安全的最佳方式。身份識別是這兩種協議的一種實現,它對解決當前mobile,native和web 應用程序的典型安全問題進行了高度優化。
How IdentityServer4 can help
IdentityServer 是一個中間件 ,符合規范的OpenID Connect和OAuth 2.0端點應用帶任何ASP.NET Core應用程序。
通常,您構建(或重用)一個包含登錄和注銷頁面的應用程序(取決于你的需求),把IdentityServer middleware添加到必要的協議頭,因此客戶端應用程序可以使用這些標準協議與之進行通信。
托管應用程序可以像您希望的那樣復雜,但是我們通常建議通過只包含與身份驗證相關的UI來盡可能小地被攻擊。
Terminology(術語)
規范,文檔和object model 使用了一些您應該知道的術語。
../_images/terminology.png
IdentityServer
IdentityServer是一個OpenID Connect 提供者 - 它實現了OpenID Connect 和 OAuth 2.0協議。
不同的文獻使用不同的術語來表示相同的角色 - 你可能還會發現安全令牌服務security token service,身份提供者identity provider,授權服務器authorization server, IP-STS 等等
但是,它們都是一樣的:一款向客戶端提供安全令牌的軟件。
IdentityServer有許多工作和特性 - 包含:
保護你的資源
通過外部擴展的identity provider或本地賬戶對用戶進行身份驗證。
提供session 管理和單點登錄
管理和認證用戶
向clients發出標識issue identity和訪問令牌。
驗證tokens
User
用戶是一個使用注冊客戶端client訪問資源的人,
Client
Client是一個軟件,它從IdentityServer 請求token - 要么是訪問資源(請求身份令牌identity token),要么是訪問資源(請求訪問令牌access token)。Client必須在請求tokens之前首先注冊在IdentityServer 。
Clients的例子是web applications ,native mobile,desktop applications,SPAs,服務器進程等。
Resources
Resources是您想要用IdentityServer 保護的東西 - 你的用戶身份數據或者APIs.
每個resource都有唯一的名稱 - 并且 clients 使用這個名稱來指定他們想要訪問的資源。
Identity data 關于用戶的身份信息(aka claims) ,例如姓名或電子郵件地址。
APIs APIs resources表示電子client 想要調用的功能 - 典型的模型是web api ,但也不一定。
Identity Token
identity token(身份token)允許連接 API resource。Clients請求access tokens和將他們轉發到 API.
Access tokens包含了client 的信息 和用戶的(如果存在)。APIS使用這些信息來授權訪問他們的數據。
Supported Specifications
IdentityServer implements the following specifications:
OpenID Connect
OpenID Connect Core 1.0 (spec)OpenID Connect Discovery 1.0 (spec)OpenID Connect Session Management 1.0 - draft 28 (spec)OpenID Connect Front-Channel Logout 1.0 - draft 02 (spec)OpenID Connect Back-Channel Logout 1.0 - draft 04 (spec)
OAuth 2.0
OAuth 2.0OAuth 2.0 (RFC 6749)OAuth 2.0 Bearer Token Usage (RFC 6750)OAuth 2.0 Multiple Response Types (spec)OAuth 2.0 Form Post Response Mode (spec)OAuth 2.0 Token Revocation (RFC 7009)OAuth 2.0 Token Introspection (RFC 7662)Proof Key for Code Exchange (RFC 7636)JSON Web Tokens for Client Authentication (RFC 7523)
Packaging and Builds(包裝和構建)
IdentityServer 由很多nuget包組成。
IdentityServer4
包含了核心的IdentityServer object model,services和middleware。只包含對內存配置和用戶存儲的支持,但是你可以通過配置對其他的存儲進行插件支持。這是其它的 repos 和它的packages的內容。
Quickstart UI
包含了一個簡單的用戶界面啟動,包括登錄,注銷和同意頁面。
Access token validation handler
ASP.NET Core 身份驗證handler 用于驗證tokens 在APIs. handler允許在相同的API中支持JWT 和引用tokens
ASP.NET Core Identity
ASP.NET Core Identity 集成了 package 對于 IdentityServer。package提供了一個簡單的配置API來使用ASP.NET Identity 為你的IdentityServer users提供管理程序庫。
EntityFramework Core
EntityFramework Core 存儲實現對于EntityFramework Core。這個package提供了EntityFramework的實現對于配置和在IdentityServer操作存儲。
Dev builds(開發構建)
此外,我們還向MyGet發布了 dev/interim構建版本。如果你想試一試,把下面的內容添加到你的Visual Studio中。
https://www.myget.org/F/identity/
Support and Consulting Options
We have several free and commercial support and consulting options for IdentityServer.
Free support
Free support is community-based and uses public forums
StackOverflow
There’s an ever growing community of people using IdentityServer that monitor questions on StackOverflow. If time permits, we also try to answer as many questions as possible
You can subscribe to all IdentityServer4 related questions using this feed:
https://stackoverflow.com/questions/tagged/?tagnames=identityserver4&sort=newest
Please use the IdentityServer4
tag when asking new questions
Gitter
You can chat with other IdentityServer4 users in our Gitter chat room:
https://gitter.im/IdentityServer/IdentityServer4
Reporting a bug
If you think you have found a bug or unexpected behavior, please open an issue on the Github issue tracker. We try to get back to you ASAP. Please understand that we also have day jobs, and might be too busy to reply immediately.
Also check the contribution guidelines before posting.