前言
哈嘍大家周四好!時(shí)間過的很快,現(xiàn)在已經(jīng)是三月份了,我的 IdentityServer4 教程也拖了一定的時(shí)間了,正好最近有精力學(xué)新東西了,主要中間被小伙伴要求寫一個(gè)管理后臺(tái),目前1.0已經(jīng)上線(《權(quán)限后臺(tái)系統(tǒng) 1.0 正式上線》),平時(shí)也一直開發(fā)維護(hù)中,希望能達(dá)到更優(yōu)吧。
開發(fā)之余,晚上的時(shí)候,一直慢慢的學(xué)習(xí) Id4,經(jīng)過了大概半個(gè)月的簡單資料尋找和學(xué)習(xí),對(duì) Id4 有了初步的認(rèn)識(shí),發(fā)現(xiàn)隨著不斷地學(xué)習(xí),其實(shí)也沒有剛開始學(xué)的時(shí)候的那種莫名的恐懼感了(有些小伙伴應(yīng)該會(huì)有和我一樣的心情,就是初學(xué)一門技術(shù)的時(shí)候,內(nèi)心總是很恐慌的,比如我當(dāng)時(shí)學(xué)DDD(地址:《D3模式設(shè)計(jì)初探 與 我的計(jì)劃書》),其實(shí)我認(rèn)為我們恐慌的不是學(xué)不會(huì),而是對(duì)學(xué)習(xí)動(dòng)力的不自信,大膽的學(xué)就對(duì)了,哪怕最后只知道OAuth是啥,哪怕最后只會(huì)照著套模板,也是一種成功?。?/p>
從今天起,我將慢慢的更新 IdentityServer4 系列,因?yàn)槲疫€沒有學(xué)習(xí)完,所以會(huì)一邊學(xué)習(xí)一邊開發(fā),最后形成一個(gè)統(tǒng)一的服務(wù)項(xiàng)目,初步打算把所有開源的這些項(xiàng)目(Blog.Vue、Blog.tBug、Blog.Admin、DDD等,相關(guān)項(xiàng)目參看開源地址 https://github.com/anjoy8)都集中到這一個(gè)授權(quán)服務(wù)器上,我暫時(shí)取名為 Blog.IdentityServer ,正好有 vue/js 項(xiàng)目,也有 MVC 項(xiàng)目,{把這個(gè)系列寫完,前后端分離就差不多了,我也不打算再寫了},至于如何搭建倉庫,如何多項(xiàng)目調(diào)用,這我先斟酌下,會(huì)在以后的文章中,一一說到,因?yàn)橐玫?EFCore 來處理用戶數(shù)據(jù),我個(gè)人感覺這還是一個(gè)很實(shí)用的項(xiàng)目,畢竟這幾個(gè)都是實(shí)實(shí)在在的有血有肉的工程,不只是一個(gè)簡單的Demo,自己都可以拿來改改優(yōu)化優(yōu)化,直接用了(我這王婆賣瓜也是沒誰了??)。
本文只是一個(gè)開篇講,不會(huì)涉及到內(nèi)容知識(shí)點(diǎn),有很多小伙伴都是一直看我的文章的,特別是看過我寫的JWT 微軟官方自帶授權(quán)認(rèn)證的《JWT授權(quán)》,如果之前的你能看懂,或者八成懂,那么這個(gè)系列肯定也能,如果以前的都看不懂,(⊙﹏⊙),只能說咱們緣分太淺??。
廢話不多說,先把我這兩周的小成果展示下,當(dāng)然,現(xiàn)在很low,以后會(huì)各種優(yōu)化和改進(jìn),預(yù)計(jì)會(huì)有十篇文章,
故事背景
這個(gè)是我的第一個(gè) Vue.js 項(xiàng)目 Blog.Vue,(長的很丑,我決定趁著這個(gè)機(jī)會(huì),把這個(gè)美化一下,畢竟我也是看臉的,先用這個(gè)練練手,其他的再慢慢更新授權(quán)),這個(gè)項(xiàng)目首頁不需要登錄,但是詳情頁需要用戶登錄,之前我是走的 Blog.Core 很普通的登錄,那以后全部會(huì)走 Blog.IdentityServer 統(tǒng)一授權(quán)服務(wù)器了,請(qǐng)注意是兩個(gè)端口/域名(Vue是6688端口,Id4是5002端口):

可能你會(huì)感覺很簡單,不就是一個(gè)客戶端跳轉(zhuǎn)到授權(quán)服務(wù)器嘛,然后登錄了再跳轉(zhuǎn)過來,增加了個(gè)用戶角色授權(quán),額,我也感覺挺簡單的,可是我一個(gè)月前真不是這么認(rèn)為的,當(dāng)時(shí)我感覺還是有點(diǎn)兒難度,現(xiàn)在看起來還可以,所以說,Id4想入門還是可以的,至于后期匹配的微服務(wù)了,API網(wǎng)關(guān)了,負(fù)載均衡了,嗯,來日方長。
一、目錄
1、源代碼Github
授權(quán)服務(wù):https://github.com/anjoy8/Blog.IdentityServer
資源服務(wù):https://github.com/anjoy8/Blog.Core
客戶端一:https://github.com/anjoy8/Blog.Admin
以后每一個(gè)項(xiàng)目修改完登錄授權(quán),這里就列舉一個(gè),爭取把所有項(xiàng)目的授權(quán)都遷到 Id4 服務(wù)器上。
2、本系列文章一覽
- 01 ║ 授權(quán)服務(wù)器 IdentityServer4 開篇講&計(jì)劃書
- 02 ║ 基礎(chǔ)知識(shí)集合 & 項(xiàng)目搭建一
- 03 ║ 詳解授權(quán)持久化 & 用戶數(shù)據(jù)遷移
二、到底什么是 IdentityServer4 ?

1、先看看概念
我們通過查看官網(wǎng),就看到官方很明顯的定義(下文的必看文檔中有官網(wǎng)地址):
<pre style="color: rgb(0, 0, 0); font-family: "Courier New"; font-size: 12px; margin: 5px 8px; padding: 5px;">IdentityServer4 is an OpenID Connect and OAuth 2.0 framework for ASP.NET Core 2.</pre>
IdentityServer是基于OpenID Connect協(xié)議標(biāo)準(zhǔn)的身份認(rèn)證和授權(quán)程序,它實(shí)現(xiàn)了OpenID Connect 和 OAuth 2.0 協(xié)議。
同一種概念,不同的文獻(xiàn)使用不同的術(shù)語,比如你看到有些文獻(xiàn)把他叫做安全令牌服務(wù)(Security Token Service),
身份提供(Identity Provider),授權(quán)服務(wù)器(Authorization Server),IP-STS 等等。其實(shí)他們都是一個(gè)意思,目的都是在軟件應(yīng)用中為客戶端頒發(fā)令牌并用于安全訪問的。
IdentityServer有許多功能:
保護(hù)你的資源
使用本地帳戶或通過外部身份提供程序?qū)τ脩暨M(jìn)行身份驗(yàn)證
提供會(huì)話管理和單點(diǎn)登錄
管理和驗(yàn)證客戶機(jī)
向客戶發(fā)出標(biāo)識(shí)和訪問令牌
驗(yàn)證令牌
2、它有什么優(yōu)點(diǎn)?

現(xiàn)在的應(yīng)用開發(fā)層出不窮,基于瀏覽器的網(wǎng)頁應(yīng)用,基于微信的公眾號(hào)、小程序,基于IOS、Android的App,基于Windows系統(tǒng)的桌面應(yīng)用和UWP應(yīng)用等等,這么多種類的應(yīng)用,就給應(yīng)用的開發(fā)帶來的挑戰(zhàn),我們除了分別實(shí)現(xiàn)各個(gè)應(yīng)用外,我們還要考慮各個(gè)應(yīng)用之間的交互,通用模塊的提煉,其中身份的認(rèn)證和授權(quán)就是每個(gè)應(yīng)用必不可少的的一部分。而現(xiàn)在的互聯(lián)網(wǎng),對(duì)于信息安全要求又十分苛刻,所以一套統(tǒng)一的身份認(rèn)證和授權(quán)就至關(guān)重要。
優(yōu)點(diǎn):簡單
因此,從實(shí)現(xiàn)者的角度來看,我在OAuth 2中看到的主要優(yōu)點(diǎn)是復(fù)雜性降低。它不需要請(qǐng)求簽名過程,這是不是很難,但肯定是fiddly。它大大減少了作為服務(wù)的客戶端所需的工作,這是(在現(xiàn)代的,移動(dòng)世界)你最想要最小化疼痛的地方。在服務(wù)器 – >內(nèi)容提供者端的降低的復(fù)雜性使其在數(shù)據(jù)中心中更具可擴(kuò)展性。
它將標(biāo)準(zhǔn)的一些擴(kuò)展編碼為OAuth 1.0a(如xAuth),現(xiàn)在廣泛使用。
大多數(shù)的應(yīng)用都如上所示,基本上都是通過客戶端對(duì)API進(jìn)行請(qǐng)求(瀏覽器、Web程序、本機(jī)應(yīng)用程序)等。當(dāng)你的項(xiàng)目到了一定得范圍和大小之后,就有可能去使用Nginx,這個(gè)時(shí)候,也必須考慮站點(diǎn)的安全性,因?yàn)椴荒茏屇愕暮诵臉I(yè)務(wù)信任外界任何的調(diào)用.當(dāng)然還有的時(shí)候,我們的擁有自己的一套API,為自己服務(wù)進(jìn)行使用,我們不想讓別人來調(diào)用我們的,這個(gè)時(shí)候也可以進(jìn)行使用。
三、開發(fā)白皮書

這里引用下圣杰的圖,圣杰是我知道為數(shù)不多的,知識(shí)和Code都很強(qiáng)的大佬,曾經(jīng)有緣聊過兩句。
1、用到了哪些知識(shí)點(diǎn)
正如上邊的結(jié)構(gòu)腦圖中顯示的,大概就是這么多,可能你會(huì)感覺很多,開始你簡單看一下,有些概念咱們?cè)谥v JWT 授權(quán)的時(shí)候,都說過見過,甚至親身用過,比如:JWT(以及其中的iss、sub、expires等等),Claim, Authentication,access_token,還有所謂的API Resource資源。
- OAuth 2.0 簡介 ??
- OpenID 和 OAuth 的區(qū)別 ??
- 客戶端授權(quán)模式(Client Credentials)??
- 密碼授權(quán)模式(Resource Owner Password Credentials)??
- 授權(quán)碼授權(quán)模式(Authorization Code Flow,MVC調(diào)用)??
- 簡化授權(quán)模式-OpenID(Implicit Flow,JS/Vue 客戶端調(diào)用)??
- 混合模式-OpenID & OAuth(Hybrid Flow,角色+策略授權(quán))??
- 集成 ASP.NET Core Identity and EntityFramework Core ??
- 單點(diǎn)登錄 ??
- 刷新登錄 RefreshToken ??
- 外部登錄(比如QQ、Google、Github等)??
2、部分結(jié)構(gòu)/流程圖

(Authorization Code)

(使用 OpenID Connect 的身份驗(yàn)證流)
3、必看文檔
我一直堅(jiān)信,只要把官方文檔啃透了,肯定能學(xué)會(huì),至少會(huì)七成,好多人都沒有養(yǎng)成這個(gè)習(xí)慣,就直接看Demo了,希望大家還是先看看文檔。
IdentityServer4:https://identityserver4.readthedocs.io/en/latest/
OAuth2.0:https://oauth.net/2/
OpenID Connect:https://openid.net/connect/
四、特別鳴謝
1、https://docs.azure.cn/zh-cn/active-directory/develop/authentication-scenarios
2、https://github.com/IdentityServer/IdentityServer4.Samples
3、IdentityServer4 for OpenID Connect 和 OAuth 2.0
五、Github && Gitee
以后會(huì)上傳本系列 Id4 倉庫...
---END