一、前言我們現(xiàn)在日常生活中,會(huì)使用各式各樣的應(yīng)用程序,層出不窮,其中有基于網(wǎng)頁(yè)瀏覽方式的應(yīng)用,有基于手機(jī)端的App,甚至有基于流行的公眾號(hào)和小程序等等,這些應(yīng)用,我們不僅要實(shí)現(xiàn)各個(gè)應(yīng)用的功能之外,還要考慮各個(gè)應(yīng)用之間的交互作用,其中身份的認(rèn)證和授權(quán)就是每個(gè)應(yīng)用必不可少的的一部分。 所以我們以身份認(rèn)證和授權(quán)這一部分為例,需要考慮各個(gè)應(yīng)用直接的交互,統(tǒng)一管理以及信息安全問(wèn)題。 而現(xiàn)在的互聯(lián)網(wǎng),對(duì)于信息安全要求又十分苛刻,所以一套統(tǒng)一的身份認(rèn)證和授權(quán)就至關(guān)重要。
所以,我們可以根據(jù) 二、說(shuō)明
我們通過(guò)查看 IdentityServer4官網(wǎng),就可以看到給出的定義: IdentityServer4 is an OpenID Connect and OAuth 2.0 framework for ASP.NET Core.
由此可見(jiàn),IdentityServer是基于OpenID Connect協(xié)議標(biāo)準(zhǔn)的身份認(rèn)證和授權(quán)程序,實(shí)現(xiàn)了OpenID Connect和OAuth2.0協(xié)議的結(jié)合。 所以,IdentityServer4是為ASP.NET CORE量身定制的實(shí)現(xiàn)了OpenId Connect和OAuth2.0協(xié)議的認(rèn)證授權(quán)中間件。通常,你構(gòu)建(或重新使用)包含登錄和注銷頁(yè)面的應(yīng)用程序,IdentityServer中間件會(huì)向其添加必要的協(xié)議頭,以便客戶端應(yīng)用程序可以使用這些標(biāo)準(zhǔn)協(xié)議與其對(duì)話。
2.1 特性
通過(guò)不同的文獻(xiàn)使用的術(shù)語(yǔ)我們會(huì)發(fā)現(xiàn),同一個(gè)概念可能存在著多種解釋,比如有些把他稱為安全令牌服務(wù)(Security Token Service), 2.2 功能
三、引申3.1 OAuth2.0OAuth2.0 是OAuth協(xié)議的延續(xù),OAuth2.0 關(guān)注客戶端開(kāi)發(fā)者的簡(jiǎn)易性,為用戶資源提供一個(gè)安全的、開(kāi)放而有建議的標(biāo)準(zhǔn)。是目前流行的授權(quán)機(jī)制,用于授權(quán)第三方應(yīng)用就可以獲取該用戶資源。因此OAuth是安全的。 為了安全,Oauth2.0 引入了兩個(gè)措施:
3.1.1 場(chǎng)景OAuth2.0 是目前最流行的授權(quán)機(jī)制,用來(lái)授權(quán)第三方應(yīng)用,獲取用戶數(shù)據(jù)。 (以下以 第三方A網(wǎng)站用戶訪問(wèn)授權(quán)獲取在B網(wǎng)站資源 為例 。參考:理解OAuth 2.0) 為了讓A網(wǎng)站應(yīng)用訪問(wèn)在B網(wǎng)站上的存儲(chǔ)的照片、視頻或者聯(lián)系方式等等私密資源,我們可能需要做到的就是讓B網(wǎng)站同意A網(wǎng)站訪問(wèn)讀取這些資源,那么,在傳統(tǒng)的方式中,會(huì)將自己在B網(wǎng)站中的用戶名和密碼告訴A,后者就可以讀取用戶的資源信息了,但是這樣做存在了嚴(yán)重的問(wèn)題:
因此,這種方式是不安全的,所以為了解決這種問(wèn)題,OAuth就解決了這種問(wèn)題。 允許用戶讓第三方A應(yīng)用訪問(wèn)該用戶在B網(wǎng)站上存儲(chǔ)的私密的資源(如照片,視頻,聯(lián)系人列表),而無(wú)需將用戶名和密碼提供給第三方應(yīng)用。就比如我用QQ登錄博客園,那博客園(第三方應(yīng)用)的昵稱就可以是我的QQ(某網(wǎng)站)昵稱,它獲取到了我的QQ昵稱,并存到了博客園的數(shù)據(jù)庫(kù),我以后就一直可以使用QQ來(lái)登錄博客園,但是博客園卻不知道我QQ的用戶名和密碼。 3.1.2 說(shuō)明OAuth在"客戶端"與"服務(wù)提供商"之間,設(shè)置了一個(gè)授權(quán)層(authorization layer)。"客戶端"不能直接登錄"服務(wù)提供商",只能登錄授權(quán)層,以此將用戶與客戶端區(qū)分開(kāi)來(lái)。"客戶端"登錄授權(quán)層所用的令牌(token),與用戶的密碼不同。用戶可以在登錄的時(shí)候,指定授權(quán)層令牌的權(quán)限范圍和有效期。 "客戶端"登錄授權(quán)層以后,"服務(wù)提供商"根據(jù)令牌的權(quán)限范圍和有效期,向"客戶端"開(kāi)放用戶儲(chǔ)存的資料。
(A)用戶打開(kāi)客戶端以后,客戶端要求用戶給予授權(quán)。 3.1.3 模式用戶怎樣實(shí)現(xiàn)客戶端授權(quán),所以需要通過(guò)不同的授權(quán)模式讓客戶端可以獲取令牌,進(jìn)而獲取資源。因此,客戶端獲取授權(quán)常用的模式如下:
3.2 OpenID ConnectOpenID Connect是基于OAuth 2.0規(guī)范族的可互操作的身份驗(yàn)證協(xié)議。它使用簡(jiǎn)單的REST / JSON消息流來(lái)實(shí)現(xiàn),和之前任何一種身份認(rèn)證協(xié)議相比,開(kāi)發(fā)者可以輕松集成。 OpenID Connect允許開(kāi)發(fā)者驗(yàn)證跨網(wǎng)站和應(yīng)用的用戶,而無(wú)需擁有和管理密碼文件。 OpenID Connect允許所有類型的客戶,包括基于瀏覽器的JavaScript和本機(jī)移動(dòng)應(yīng)用程序,啟動(dòng)登錄流動(dòng)和接收可驗(yàn)證斷言對(duì)登錄用戶的身份。 進(jìn)一步來(lái)說(shuō):
OpenID Connect vs OpenID 2.0:OpenID Connect完成很多與OpenID 2.0(即認(rèn)證,對(duì)用戶的身份進(jìn)行認(rèn)證,判斷其身份是否有效)相同的任務(wù),是API-friendly,定義了可選的簽名和加密的機(jī)制; OAuth 1.0和OpenID 2.0的集成需要擴(kuò)展,而OpenID Connect協(xié)議本身就建立在OAuth 2.0之上。
因此,OpenID Connect 是“認(rèn)證”和“授權(quán)”的結(jié)合。
為什么開(kāi)發(fā)者要使用OpenID Connect?
四、區(qū)別4.1 OAuth 與 OpenID首先,來(lái)認(rèn)識(shí)兩個(gè)英文單詞,也是我們?cè)谄綍r(shí)中很容易混淆的。
而在認(rèn)證授權(quán)服務(wù)中,也應(yīng)用了這兩個(gè)單詞的表面意思。
OpenID : 是Authentication,即認(rèn)證,對(duì)用戶的身份進(jìn)行認(rèn)證,判斷其身份是否有效,也就是讓網(wǎng)站知道“你是你所聲稱的那個(gè)用戶”。
OAuth : 是Authorization,即授權(quán),在已知用戶身份合法的情況下,經(jīng)用戶授權(quán)來(lái)允許某些操作,也就是讓網(wǎng)站知道“你能被允許做那些事情”。
由此可知,授權(quán)要在認(rèn)證之后進(jìn)行,只有確定用戶身份只有才能授權(quán)。 4.1.1 場(chǎng)景OpenID 是證實(shí)身份(Authentication)作用的,就好比我們參加大型考試一下,進(jìn)考場(chǎng)的時(shí)候,監(jiān)考官需要我們拿出身份證和準(zhǔn)考證來(lái)檢驗(yàn),比對(duì)是否是同一個(gè)人。這個(gè)過(guò)程就是在驗(yàn)證 “身份,這就是我”,同時(shí)也證實(shí)了這不是一個(gè)匿名偽造的不可信任信息。考官比對(duì)身份成功后,就會(huì)進(jìn)一步詢問(wèn)。
但是如果你想在認(rèn)證過(guò)程中獲得用戶的其他信息(比如手機(jī)號(hào)等 )就得多做一步了。 OAuth 是關(guān)于授權(quán)、許可(Authorization)的,當(dāng)考官看完比對(duì)你的身份后,還要求掏出兜里的東西,拿出隨身攜帶里的東西、手機(jī)等隨身物品以便檢查,檢查你是否攜帶考場(chǎng)違規(guī)物品,這時(shí)就需要得到被檢查人的許可才行,被檢查人有權(quán)利扭頭就走,但要想進(jìn)場(chǎng)考試,必須給予許可、配合檢查。這是在回答「我同意讓你對(duì)我進(jìn)一步做些什么」,是為了在被授予權(quán)限的前提下,更多的獲取除了個(gè)人信息以外,身上攜帶的東西是否包含違規(guī)物品。(如:手機(jī),計(jì)算器,手表,非指定文具等)
# 借鑒網(wǎng)友的說(shuō)明: 如今越來(lái)越多的網(wǎng)站,以及一些應(yīng)用程序都開(kāi)始使用第三方社交平臺(tái)賬戶登錄,那這里就會(huì)涉及到安全性的問(wèn)題,隱私的問(wèn)題,你不能隨意來(lái)獲取我的資料,當(dāng)然你來(lái)使用我的資料,你要經(jīng)過(guò)用戶的同意,那這個(gè)用戶是不是我平臺(tái)上,還是要來(lái)向我求證,那在這個(gè)過(guò)程中,實(shí)際上就出現(xiàn)了兩個(gè)過(guò)程,我們還是直接使用上次的例子來(lái)說(shuō)明,比較直觀,博客園使用QQ登錄,進(jìn)入博客園的登錄頁(yè),點(diǎn)擊使用QQ登錄: 在進(jìn)入到QQ登錄界面后,最開(kāi)始是要請(qǐng)求認(rèn)證,用戶輸入QQ號(hào)和密碼,點(diǎn)擊登錄,騰訊互聯(lián)會(huì)先進(jìn)行驗(yàn)證該用戶是否為我的用戶,如果是我的用戶,那么我會(huì)通知你(博客園),他是我的用戶,你可以使用該賬戶登錄你的系統(tǒng),這個(gè)過(guò)程就是認(rèn)證(Authentication),認(rèn)證就是證明你是誰(shuí),你是否是真實(shí)存在的,就好像,快遞員來(lái)給你送快遞,讓你出示你的身份證,他確定你是本人后,把快遞給你,這就是OpenID。 而在QQ授權(quán)登錄下方,有兩給CheckBox復(fù)選框,可以允許博客園獲得您的昵稱、頭像、性別,這是在認(rèn)證之后的事了,在騰訊互聯(lián)你是我平臺(tái)的用戶后,你可以自己選擇博客園是否有權(quán)去獲取你的相關(guān)信息,當(dāng)你勾選后,騰訊互聯(lián)就把你的這些基本信息給了博客園,這個(gè)過(guò)程就是授權(quán)(Authorization),授權(quán)就是確定了你是誰(shuí)后,又把屬于你的東西給了別人,猶如你向快遞員出示了身份證,然后你又把你房門(mén)的密碼給了他,并告訴他說(shuō),我把房門(mén)密碼給你,你幫我放到我客廳里吧。
可以看出,OAuth 相對(duì)于 OpenID 最大的區(qū)別就是,網(wǎng)站在認(rèn)證授權(quán)的過(guò)程中實(shí)際上是拿到了你的帳戶訪問(wèn)權(quán)限繼而確認(rèn)你的身份,但是這同時(shí)也存在一個(gè)安全隱患,因?yàn)榫W(wǎng)站在拿到你的“唯一標(biāo)識(shí)”的同時(shí)還拿到了一把你的賬戶的 “臨時(shí)鑰匙”。但是你不知道網(wǎng)站會(huì)不會(huì)拿這把鑰匙“干壞事”,這個(gè)只有站長(zhǎng)心里清楚。同時(shí) OAuth 還比 OpenID 多了幾個(gè)額外的請(qǐng)求步驟,登錄所費(fèi)時(shí)間一定是長(zhǎng)于 OpenID 的。 4.2 OAuth、OpenID 與 OpenID Connect
OpenID Connect 因?yàn)槠浠?em>OAuth協(xié)議(可以看上文OAuth說(shuō)明),所以OpenID-Connect協(xié)議中也包含了client_id、client_secret還有redirect_uri等字段標(biāo)識(shí)。這些信息被保存在“身份認(rèn)證服務(wù)器”,以確保特定的客戶端收到的信息只來(lái)自于合法的應(yīng)用平臺(tái)。這樣做是目的是為了防止client_id泄露而造成的惡意網(wǎng)站發(fā)起的OIDC流程。
因此,OpenID Connect 是“認(rèn)證”和“授權(quán)”的結(jié)合。
簡(jiǎn)要而言,OIDC是一種安全機(jī)制,用于應(yīng)用連接到身份認(rèn)證服務(wù)器(Identity Service)獲取用戶信息,并將這些信息以安全可靠的方法返回給應(yīng)用。 # 借鑒網(wǎng)友說(shuō)明 舉個(gè)例子。某個(gè)用戶使用*Facebook*應(yīng)用*“What online quiz best describes you?”* ,該應(yīng)用可以通過(guò)*Facebook*賬號(hào)登錄,則你可以在應(yīng)用中發(fā)起請(qǐng)求到“身份認(rèn)證服務(wù)器”(也就是Facebook的服務(wù)器)請(qǐng)求登錄。這時(shí)你會(huì)看到界面,詢問(wèn)是否授權(quán)。 在 OAuth 中,這些授權(quán)被稱為scope。OpenID-Connect也有自己特殊的scope--openid ,它必須在第一次請(qǐng)求“身份鑒別服務(wù)器”(Identity Provider,簡(jiǎn)稱IDP)時(shí)發(fā)送過(guò)去。
4.3 JWT 與 OAuth2 .0要比較JWT和OAuth2,首先要明白一點(diǎn)就是,這兩個(gè)根本沒(méi)有可比性,是兩個(gè)完全不同的東西。 但是既然是沒(méi)有可比性,為何還要放一塊比較呢?實(shí)際開(kāi)發(fā)應(yīng)用中,就發(fā)現(xiàn)很多拿 JWT和OAuth2.0 作對(duì)比,很多情況下,在討論OAuth2的實(shí)現(xiàn)時(shí),會(huì)把JSON Web Token作為一種認(rèn)證機(jī)制使用。這也是為什么他們會(huì)經(jīng)常一起出現(xiàn)。 4.3.1 內(nèi)容區(qū)別
4.3.2 場(chǎng)景區(qū)別
4.3.3 歸納說(shuō)明
五、總結(jié)
|
|
|
來(lái)自: 新進(jìn)小設(shè)計(jì) > 《待分類》