以下思路參考于 IdentityServer4 源碼,流程。閱讀文章請(qǐng) 先 熟悉 OAuth 2.0, Open ID ,Open ID Connect 。本文章已申請(qǐng)授權(quán)騎士處理,轉(zhuǎn)載請(qǐng)注明出處。
存儲(chǔ)于 本機(jī) Markdown文檔。 | 待更新。
IdentityServer4是一個(gè)針對(duì) ASP.NET Core 2.0 的OpenID Connect 和 OAuth 2.0框架。
在你的應(yīng)用中,它支持以下特性:
Authentication as a Service
所有應(yīng)用程序的集中登錄邏輯和工作流(web,native,mobile,services),IdentityServer 是一個(gè)官方認(rèn)證的OpenID Connect的實(shí)現(xiàn)。
Single Sign-on / Sign-out
在多個(gè)應(yīng)用程序類型的登入和登出
Access Control for APIs
為不同的客戶端提供api的訪問令牌,e.g. server to server, web 應(yīng)用,SPAs和 native .mobile apps
Federation Gateway(聯(lián)合網(wǎng)關(guān))
支持如Azure AD,Google,Facebook等外部的身份驗(yàn)證提供者,這將保護(hù)你的應(yīng)用程序從如何連接到這些外部提供程序的細(xì)節(jié)。
Focus on Customization(專注于定制)
最重要的一部分--IdentityServer 的很多方面都可以定制,以滿足你的需求,由于IdentityServer 是一個(gè)框架,而不是一個(gè)boxed product或者一個(gè)SaaS,所以你可以編寫代碼來對(duì)系統(tǒng)進(jìn)行調(diào)整,以適應(yīng)您的場(chǎng)景。
Mature Open Source(成熟的開源)
IdentityServer 使用了Apache 2的開源許可,允許在它上面構(gòu)建商業(yè)產(chǎn)品,它也是.NET Foundation的一部分,提供了法律支持和治理。
Free and Commercial Support(免費(fèi)和商業(yè)支持)
如果你需要幫助構(gòu)建或運(yùn)行您的身份平臺(tái),請(qǐng)讓我們知道,我們有幾種方法可以幫組你。
The Big Picture
大多數(shù)現(xiàn)代應(yīng)用程序或多或少都是這樣的:

最常見的互動(dòng)是:
瀏覽器與Web 應(yīng)用程序的通信
Web應(yīng)用程序與Web api進(jìn)行通信(有時(shí)是自己的,也有代表用戶的)
基于瀏覽器的應(yīng)用程序與web apis通信
Native applications 與 web APIs通信
基于服務(wù)器的應(yīng)用程序與Web api通信
web api 與web api 進(jìn)行通信(有時(shí)是自己的,有時(shí)代表用戶)
通常,每個(gè)層(前端,中間層和后端)都必須保護(hù)資源,并實(shí)現(xiàn)身份驗(yàn)證/或授權(quán) --通常是針對(duì)同一個(gè)用戶存儲(chǔ)的。
將這些基本安全功能外包給安全令牌服務(wù),可以防止在這些應(yīng)用程序和端點(diǎn)之間復(fù)制該功能,
對(duì)應(yīng)用程序進(jìn)行重構(gòu)以支持安全令牌服務(wù),這將導(dǎo)致以下體系和協(xié)議:

這樣的設(shè)計(jì)將安全問題分為兩部分:
Authentication
當(dāng)應(yīng)用程序需要了解當(dāng)前用戶的身份時(shí),需要進(jìn)行身份驗(yàn)證。通常,這些應(yīng)用程序?yàn)榱巳ス芾頂?shù)據(jù)和需要去確保這個(gè)用戶能被與允許連接這些數(shù)據(jù)。最常見的例子就是web 應(yīng)用程序,但是是基于native和JS的應(yīng)用程序也需要去進(jìn)行身份驗(yàn)證。
OpenID Connect是最新的三個(gè),但它被認(rèn)為是未來,因?yàn)樗鼘?duì)現(xiàn)代應(yīng)用最有潛力。它是為移動(dòng)應(yīng)用場(chǎng)景而建的,從開始和設(shè)計(jì)也是友好的和API。
API Access
應(yīng)用程序有兩種基本的方式與API進(jìn)行通信。使用application identity,或者委托user’s identity。有時(shí)這兩種方法需要結(jié)合使用。
OAurh2 是一種協(xié)議,允許應(yīng)用程序從安全令牌服務(wù)請(qǐng)求訪問令牌,并使用它們與api進(jìn)行通信,這個(gè)委托減少了客戶端應(yīng)用程序和身份驗(yàn)證和身份驗(yàn)證之后的api復(fù)雜性。
OpenID Connect and OAuth 2.0 – better together
OpenID Connect 和OAuth 2.o非常相似--實(shí)際上,OpenID Connect 是OAuth2.0的一個(gè)擴(kuò)展,兩個(gè)基本的安全問題,身份驗(yàn)證和API訪問,被組合成一個(gè)單一的協(xié)議--通常是對(duì)安全令牌服務(wù)進(jìn)行一次單獨(dú)的訪問。
我們相信,在可預(yù)見的未來,OpenID Connect和OAuth2.0的結(jié)合是確保現(xiàn)代應(yīng)用程序安全的最佳方式。身份識(shí)別是這兩種協(xié)議的一種實(shí)現(xiàn),它對(duì)解決當(dāng)前mobile,native和web 應(yīng)用程序的典型安全問題進(jìn)行了高度優(yōu)化。
How IdentityServer4 can help
IdentityServer 是一個(gè)中間件 ,符合規(guī)范的OpenID Connect和OAuth 2.0端點(diǎn)應(yīng)用帶任何ASP.NET Core應(yīng)用程序。
通常,您構(gòu)建(或重用)一個(gè)包含登錄和注銷頁面的應(yīng)用程序(取決于你的需求),把IdentityServer middleware添加到必要的協(xié)議頭,因此客戶端應(yīng)用程序可以使用這些標(biāo)準(zhǔn)協(xié)議與之進(jìn)行通信。

托管應(yīng)用程序可以像您希望的那樣復(fù)雜,但是我們通常建議通過只包含與身份驗(yàn)證相關(guān)的UI來盡可能小地被攻擊。
Terminology(術(shù)語)
規(guī)范,文檔和object model 使用了一些您應(yīng)該知道的術(shù)語。
../_images/terminology.png
IdentityServer
IdentityServer是一個(gè)OpenID Connect 提供者 - 它實(shí)現(xiàn)了OpenID Connect 和 OAuth 2.0協(xié)議。
不同的文獻(xiàn)使用不同的術(shù)語來表示相同的角色 - 你可能還會(huì)發(fā)現(xiàn)安全令牌服務(wù)security token service,身份提供者identity provider,授權(quán)服務(wù)器authorization server, IP-STS 等等
但是,它們都是一樣的:一款向客戶端提供安全令牌的軟件。
IdentityServer有許多工作和特性 - 包含:
保護(hù)你的資源
通過外部擴(kuò)展的identity provider或本地賬戶對(duì)用戶進(jìn)行身份驗(yàn)證。
提供session 管理和單點(diǎn)登錄
管理和認(rèn)證用戶
向clients發(fā)出標(biāo)識(shí)issue identity和訪問令牌。
驗(yàn)證tokens
User
用戶是一個(gè)使用注冊(cè)客戶端client訪問資源的人,
Client
Client是一個(gè)軟件,它從IdentityServer 請(qǐng)求token - 要么是訪問資源(請(qǐng)求身份令牌identity token),要么是訪問資源(請(qǐng)求訪問令牌access token)。Client必須在請(qǐng)求tokens之前首先注冊(cè)在IdentityServer 。
Clients的例子是web applications ,native mobile,desktop applications,SPAs,服務(wù)器進(jìn)程等。
Resources
Resources是您想要用IdentityServer 保護(hù)的東西 - 你的用戶身份數(shù)據(jù)或者APIs.
每個(gè)resource都有唯一的名稱 - 并且 clients 使用這個(gè)名稱來指定他們想要訪問的資源。
Identity data 關(guān)于用戶的身份信息(aka claims) ,例如姓名或電子郵件地址。
APIs APIs resources表示電子client 想要調(diào)用的功能 - 典型的模型是web api ,但也不一定。
Identity Token
identity token(身份token)允許連接 API resource。Clients請(qǐng)求access tokens和將他們轉(zhuǎn)發(fā)到 API.
Access tokens包含了client 的信息 和用戶的(如果存在)。APIS使用這些信息來授權(quán)訪問他們的數(shù)據(jù)。
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(包裝和構(gòu)建)
IdentityServer 由很多nuget包組成。
IdentityServer4
包含了核心的IdentityServer object model,services和middleware。只包含對(duì)內(nèi)存配置和用戶存儲(chǔ)的支持,但是你可以通過配置對(duì)其他的存儲(chǔ)進(jìn)行插件支持。這是其它的 repos 和它的packages的內(nèi)容。
Quickstart UI
包含了一個(gè)簡(jiǎn)單的用戶界面啟動(dòng),包括登錄,注銷和同意頁面。
Access token validation handler
ASP.NET Core 身份驗(yàn)證handler 用于驗(yàn)證tokens 在APIs. handler允許在相同的API中支持JWT 和引用tokens
ASP.NET Core Identity
ASP.NET Core Identity 集成了 package 對(duì)于 IdentityServer。package提供了一個(gè)簡(jiǎn)單的配置API來使用ASP.NET Identity 為你的IdentityServer users提供管理程序庫。
EntityFramework Core
EntityFramework Core 存儲(chǔ)實(shí)現(xiàn)對(duì)于EntityFramework Core。這個(gè)package提供了EntityFramework的實(shí)現(xiàn)對(duì)于配置和在IdentityServer操作存儲(chǔ)。
Dev builds(開發(fā)構(gòu)建)
此外,我們還向MyGet發(fā)布了 dev/interim構(gòu)建版本。如果你想試一試,把下面的內(nèi)容添加到你的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.