本文最初發(fā)布于devever.net網(wǎng)站,經(jīng)原作者授權(quán)由InfoQ中文站翻譯并分享。
現(xiàn)在,身份驗(yàn)證協(xié)議的數(shù)量快趕上應(yīng)用程序協(xié)議,結(jié)果,這個(gè)領(lǐng)域很容易讓人困惑。
最容易把人搞糊涂的是,很少有人注意到這樣一種事實(shí):
存在許多不同種類的身份驗(yàn)證協(xié)議,它們還試圖扮演完全不同的角色。
與往常一樣,首先請(qǐng)記住,身份驗(yàn)證和授權(quán)是不一樣的功能。考慮到這一點(diǎn),本質(zhì)上存在三種不同的身份驗(yàn)證協(xié)議類別:
- 客戶端到應(yīng)用程序(客戶端身份驗(yàn)證協(xié)議)
- 應(yīng)用程序到驗(yàn)證服務(wù)器(后端身份驗(yàn)證協(xié)議)
- 單點(diǎn)登錄(客戶端到驗(yàn)證服務(wù)器到多個(gè)應(yīng)用程序)
客戶端到應(yīng)用程序的身份驗(yàn)證協(xié)議由客戶端發(fā)送給應(yīng)用程序服務(wù)器進(jìn)行身份驗(yàn)證。這種協(xié)議完全不揭示應(yīng)用程序服務(wù)器在幕后如何使用客戶端提供的信息對(duì)其進(jìn)行身份驗(yàn)證。
應(yīng)用程序到驗(yàn)證服務(wù)器的協(xié)議被應(yīng)用程序服務(wù)器用來(lái)將客戶端的身份驗(yàn)證委托給某個(gè)服務(wù)器,該客戶端已使用客戶端到應(yīng)用程序的協(xié)議提供了信息,而驗(yàn)證服務(wù)器可以更好地執(zhí)行身份驗(yàn)證決策。這種協(xié)議允許將身份驗(yàn)證處理外包給專門(mén)的身份驗(yàn)證服務(wù)器,并且無(wú)需讓身份驗(yàn)證數(shù)據(jù)庫(kù)對(duì)所有應(yīng)用程序服務(wù)器都開(kāi)放訪問(wèn)權(quán)限。
客戶端的身份驗(yàn)證狀態(tài)(例如通過(guò)客戶端到應(yīng)用程序的協(xié)議)通過(guò)單點(diǎn)登錄服務(wù)器驗(yàn)證后,一臺(tái)服務(wù)器使用單點(diǎn)登錄協(xié)議與另一臺(tái)服務(wù)器通信。換句話說(shuō),它們被用來(lái)傳遞身份驗(yàn)證決策。客戶端先前成功通過(guò)驗(yàn)證服務(wù)器的身份驗(yàn)證的事實(shí),可以在該客戶端和應(yīng)用程序服務(wù)器之間安全地傳輸。某些協(xié)議不需要進(jìn)一步干預(yù)或需要單點(diǎn)登錄服務(wù)器可用,即可允許客戶端在初始登錄后對(duì)應(yīng)用程序進(jìn)行身份驗(yàn)證,而其他協(xié)議則需要。
單點(diǎn)登錄協(xié)議實(shí)際上包含兩個(gè)協(xié)議:“客戶端到驗(yàn)證服務(wù)器”部分和“客戶端到應(yīng)用程序”部分。客戶端到驗(yàn)證服務(wù)器部分可能是定制的,有時(shí)可能是非常普通的客戶端到應(yīng)用程序的身份驗(yàn)證協(xié)議。而客戶端到應(yīng)用程序部分必須取決于SSO協(xié)議的設(shè)計(jì)。
客戶端到應(yīng)用程序協(xié)議
在客戶端到應(yīng)用程序驗(yàn)證協(xié)議的范疇內(nèi),存在驗(yàn)證框架和驗(yàn)證方法。驗(yàn)證框架是一種可擴(kuò)展的框架,它允許實(shí)施任意多種驗(yàn)證方法,并允許它在客戶端和應(yīng)用程序服務(wù)器之間動(dòng)態(tài)協(xié)商使用哪種驗(yàn)證方法。
一些身份驗(yàn)證框架已集成到特定的應(yīng)用程序協(xié)議中。還有一些通用設(shè)計(jì)旨在被集成到任意多個(gè)應(yīng)用協(xié)議中。這樣甚至將來(lái)出現(xiàn)的應(yīng)用程序協(xié)議也可以利用框架中已經(jīng)定義的所有身份驗(yàn)證方法,以及這些方法的庫(kù)實(shí)現(xiàn)。
客戶端到應(yīng)用程序的身份驗(yàn)證框架:SASL
這類框架中可能最流行的是IETF的SASL。SASL沒(méi)有定義特定的有線編碼(這部分由應(yīng)用程序負(fù)責(zé)),而是從本質(zhì)上定義了身份驗(yàn)證方法名稱(例如PLAIN、LOGIN、MD5等)的名稱空間,以及協(xié)商它們的過(guò)程。實(shí)際的方法特定協(xié)議已經(jīng)執(zhí)行,但是應(yīng)用程序協(xié)議僅需要促成不透明二進(jìn)制字符串序列的來(lái)回交換,直到身份驗(yàn)證成功或失敗為止。
簡(jiǎn)而言之,實(shí)現(xiàn)SASL的應(yīng)用程序協(xié)議僅需要提供以下機(jī)制:
- 服務(wù)器將支持的方法名稱(字符串)列表發(fā)送到客戶端的一種途徑
- 客戶端發(fā)送其要使用的方法名稱的途徑
- 客戶端將不透明的二進(jìn)制字符串發(fā)送到選定的SASL方法的一種途徑(可以由應(yīng)用程序服務(wù)器不透明地輸入到SASL庫(kù)中)
- 服務(wù)器的SASL庫(kù)將不透明的二進(jìn)制字符串發(fā)送到客戶端的一種途徑(可以不透明地反饋回客戶端的SASL庫(kù))
- 驗(yàn)證成功或失敗的一種通信途徑
如何提供這些機(jī)制取決于應(yīng)用程序協(xié)議,該協(xié)議必須定義一些適當(dāng)?shù)挠芯€協(xié)議。盡管特定的編組和狀態(tài)機(jī)是特定于應(yīng)用程序協(xié)議的,但是SASL方法本身就足夠獨(dú)立于應(yīng)用程序協(xié)議,因此實(shí)現(xiàn)各種SASL方法的通用SASL庫(kù)被廣泛采用。
一些最受歡迎的SASL方法是:
- PLAIN,以明文形式提供身份驗(yàn)證用戶名和密碼(以及可選的授權(quán)用戶名,可能與身份驗(yàn)證用戶名不同);
- LOGIN,棄用的方法,它是提供純文本用戶名和密碼的另一種方法;
- EXTERNAL,使客戶端完全不提供任何信息(可選的授權(quán)用戶名除外),并且是客戶端從連接上下文請(qǐng)求對(duì)其進(jìn)行身份驗(yàn)證的一種方式。例如,如果連接使用帶有客戶端證書(shū)的TLS,并且客戶端證書(shū)足以滿足身份驗(yàn)證的目的,則可以使用此方法進(jìn)行身份驗(yàn)證;或者也能用于僅通過(guò)客戶端IP地址對(duì)其進(jìn)行身份驗(yàn)證的情況;
- ANONYMOUS,請(qǐng)求未經(jīng)身份驗(yàn)證的訪問(wèn);
- CRAM-MD5和DIGEST-MD5是質(zhì)詢響應(yīng)身份驗(yàn)證方案,它們?cè)噲D避免傳輸未經(jīng)加密的密碼;
- NTLM,windows NT LAN Manager身份驗(yàn)證機(jī)制;
- GSSAPI,是指主要用于促成Kerberos身份驗(yàn)證的API(參見(jiàn)下文)。
如今,人們通常會(huì)使用SASL方法(例如PLAIN或LOGIN),這些方法通過(guò)安全通道(例如TLS)以明文形式傳輸密碼。
客戶端到應(yīng)用程序的身份驗(yàn)證框架:HTTP
HTTP定義自己的身份驗(yàn)證框架,并具有自己的方法集。可以說(shuō),HTTP避免SASL的原因在于其無(wú)狀態(tài)性和SASL不太相稱。由于HTTP設(shè)計(jì)的運(yùn)行機(jī)制是讓客戶端發(fā)送單個(gè)請(qǐng)求塊,然后由服務(wù)器發(fā)送單個(gè)響應(yīng),因此HTTP協(xié)議不適用于SASL設(shè)想的身份驗(yàn)證完成之前的來(lái)回?cái)?shù)據(jù)交換。
此外,對(duì)于每個(gè)請(qǐng)求都必須重復(fù)這種交換。
服務(wù)器通過(guò)發(fā)送一個(gè)401 Authorization Required錯(cuò)誤,和WWW-Authenticate標(biāo)頭來(lái)請(qǐng)求身份驗(yàn)證以訪問(wèn)資源。該標(biāo)頭包含:
- 所需的身份驗(yàn)證方法;
- “域名稱”,提供對(duì)身份驗(yàn)證域的描述;
- 必須為給定方法指定的其他參數(shù)。與SASL不同,一般來(lái)說(shuō)一臺(tái)給定服務(wù)器只有一個(gè)方法(雖說(shuō)HTTP RFC確實(shí)允許服務(wù)器通過(guò)發(fā)送多個(gè)WWW- Authenticate標(biāo)頭來(lái)支持多個(gè)方法,每個(gè)方法一個(gè)標(biāo)頭,但這種情況很少見(jiàn))。然后,客戶端使用包含相同方法名稱和方法特定身份驗(yàn)證數(shù)據(jù)的Authorization標(biāo)頭重新發(fā)出其請(qǐng)求。(請(qǐng)注意,HTTP使用術(shù)語(yǔ)authorization-授權(quán),而不是authentication-身份驗(yàn)證。)
一些常見(jiàn)的HTTP身份驗(yàn)證方法有:
- Basic(基本),以純文本形式指定用戶名和密碼;
- Digest(摘要),指定一個(gè)用戶名并以質(zhì)詢-響應(yīng)模式哈希密碼;
- Negotiate(協(xié)商),允許使用GSSAPI,并實(shí)質(zhì)上在HTTP身份驗(yàn)證內(nèi)稱為SPNEGO的GSSAPI之上,重新實(shí)現(xiàn)了SASL風(fēng)格的方法協(xié)商模式。因?yàn)樗婕皝?lái)回交換,所以可能需要多個(gè)請(qǐng)求,直到身份驗(yàn)證成功為止。Windows通常將“Negotiate/SPNEGO”用于NTLM或Kerberos身份驗(yàn)證。
客戶端到應(yīng)用程序的身份驗(yàn)證框架:SSH
SSH還使用一組可擴(kuò)展的方法定義了自己的身份驗(yàn)證框架。最常用的方法有:
- keyboard-interactive(交互式鍵盤(pán)),通過(guò)任意終端提示登錄;
- public-key(公鑰),客戶端證明其握有指定私鑰;
- gssapi,通過(guò)Kerberos登錄(參見(jiàn)下文)。
客戶端到應(yīng)用程序的身份驗(yàn)證方法:策略
客戶端到應(yīng)用程序的身份驗(yàn)證方法通常可以分為幾個(gè)基本的類別:
- 完全遵循上下文身份驗(yàn)證(例如TLS客戶端證書(shū)或IP地址身份驗(yàn)證)(例如SASL EXTERNAL)。
- 以明文形式發(fā)送用戶名和密碼,其中安全性(如果有的話)由封裝的安全通道提供,并且在任何情況下,應(yīng)用程序服務(wù)器最終以明文形式獲得密碼(例如SASL PLAIN;HTTP Basic;SSH keyboard- interactive)。
- 質(zhì)詢-響應(yīng)方案,其中服務(wù)器發(fā)出質(zhì)詢隨機(jī)數(shù),客戶端將密碼哈希或其他構(gòu)造應(yīng)用于隨機(jī)數(shù)和密碼來(lái)響應(yīng)質(zhì)詢(例如SASL CRAM-MD5)。
如今這些策略都已經(jīng)過(guò)時(shí)了,首先是由于人們常結(jié)合使用TLS與純文本傳輸,其次是因?yàn)樗鼈儍A向于避免以哈希形式在服務(wù)器上存儲(chǔ)密碼,或者要求以與驗(yàn)證方案相關(guān)的特定方式對(duì)密碼進(jìn)行哈希處理。這樣的話,密碼哈希方法就會(huì)和身份驗(yàn)證方法高度耦合。
- 非對(duì)稱密碼方案,其中客戶端在不傳輸私鑰的情況下證明其擁有私鑰(例如SSH public-key;TLS客戶端證書(shū))。
- Shared-secret(共享秘密)方案,例如TLS-PSK。
- 零知識(shí)證明方案,例如SRP。這些加密方式整潔但很少使用,并且還是會(huì)將身份驗(yàn)證協(xié)議與服務(wù)器上哈希密碼的方法緊密耦合。
- 單點(diǎn)登錄協(xié)議的客戶端到應(yīng)用程序部分。
應(yīng)用程序到身份驗(yàn)證服務(wù)器
另一類身份驗(yàn)證協(xié)議與客戶端到應(yīng)用程序的身份驗(yàn)證協(xié)議完全無(wú)關(guān),而是應(yīng)用程序到身份驗(yàn)證服務(wù)器的協(xié)議,或稱后端協(xié)議。后端驗(yàn)證協(xié)議是在應(yīng)用程序服務(wù)器和驗(yàn)證服務(wù)器之間使用的(而不是在要驗(yàn)證的實(shí)體和對(duì)其進(jìn)行驗(yàn)證的實(shí)體之間做一個(gè)協(xié)議),以便驗(yàn)證客戶端提供的驗(yàn)證細(xì)節(jié)。
這些協(xié)議經(jīng)常用于網(wǎng)絡(luò)訪問(wèn)場(chǎng)景中,其中“應(yīng)用程序”服務(wù)器是網(wǎng)絡(luò)設(shè)備,如路由器、交換機(jī)或Wi-Fi接入點(diǎn)。由于我們不希望網(wǎng)絡(luò)中的每個(gè)Wi-Fi接入點(diǎn)都保留身份驗(yàn)證數(shù)據(jù)庫(kù)的副本,因此后端協(xié)議允許將身份驗(yàn)證決策外包給一個(gè)中心化授權(quán)源。因此,后端協(xié)議必須與某種客戶端到應(yīng)用程序的身份驗(yàn)證協(xié)議結(jié)合使用:在客戶端和應(yīng)用程序之間使用客戶端到應(yīng)用程序協(xié)議,在應(yīng)用程序和身份驗(yàn)證服務(wù)器之間使用后端協(xié)議。
流行的后端身份驗(yàn)證協(xié)議包括RADIUS及其后繼者DIAMETER,它們主要用于網(wǎng)絡(luò)訪問(wèn)場(chǎng)景(例如撥號(hào)Internet身份驗(yàn)證、Wi-Fi身份驗(yàn)證等)。由于這些協(xié)議原本設(shè)計(jì)用于支持網(wǎng)絡(luò)訪問(wèn)場(chǎng)景,它們都屬于“AAA”(同時(shí)支持身份驗(yàn)證、授權(quán)、計(jì)費(fèi))協(xié)議。例如,如果需要,它們的計(jì)費(fèi)功能可對(duì)撥號(hào)Internet連接進(jìn)行基于時(shí)間和使用量的準(zhǔn)確計(jì)費(fèi)。
盡管LDAP不是為后端身份驗(yàn)證協(xié)議設(shè)計(jì)的,但它有時(shí)也被當(dāng)成身份驗(yàn)證協(xié)議來(lái)用。應(yīng)用程序服務(wù)器可以嘗試向LDAP服務(wù)器進(jìn)行身份驗(yàn)證來(lái)驗(yàn)證用戶憑據(jù)。這種方法還有一個(gè)優(yōu)點(diǎn)是,如果成功,則應(yīng)用程序服務(wù)器還可以使用LDAP檢索有關(guān)用戶的信息。
應(yīng)用程序到身份驗(yàn)證服務(wù)器:關(guān)聯(lián)的客戶端到應(yīng)用程序協(xié)議
RADIUS和DIAMETER這樣用于網(wǎng)絡(luò)訪問(wèn)場(chǎng)景的后端驗(yàn)證協(xié)議,傳統(tǒng)上設(shè)計(jì)用于和特定的客戶端到應(yīng)用程序驗(yàn)證協(xié)議結(jié)合使用,比如由PPP定義的那些。PPP是一個(gè)OSI第2層協(xié)議,支持通過(guò)串行線路和撥號(hào)調(diào)制解調(diào)器發(fā)起IP網(wǎng)絡(luò)連接。PPP定義了自己的可擴(kuò)展身份驗(yàn)證框架,并支持以下方法:
- PAP,以明文形式傳輸用戶名和密碼;
- CHAP,一種質(zhì)詢響應(yīng)方法(避免以明文形式傳輸密碼,但存在前文所述的質(zhì)詢響應(yīng)方法的缺點(diǎn));
- MS-CHAP和MS-CHAPv2,CHAP的Microsoft變體;
- EAP,可擴(kuò)展身份驗(yàn)證協(xié)議,現(xiàn)代的首選協(xié)議。
EAP本身是一個(gè)身份驗(yàn)證框架,定義了一組可擴(kuò)展的身份驗(yàn)證方法,這意味著與PPP一起使用時(shí),方法協(xié)商分為兩個(gè)級(jí)別:首先要協(xié)商EAP,然后必須協(xié)商一個(gè)特定的EAP方法。人們認(rèn)為EAP與其他PPP身份驗(yàn)證協(xié)議不同,前者設(shè)計(jì)同時(shí)用于PPP和其他網(wǎng)絡(luò)訪問(wèn)上下文(例如Wi-Fi身份驗(yàn)證或以太網(wǎng)802.1x身份驗(yàn)證)。(802.1x是對(duì)以太網(wǎng)的擴(kuò)展,可以根據(jù)成功的EAP身份驗(yàn)證來(lái)確定網(wǎng)絡(luò)訪問(wèn)權(quán)限)。
EAP和SASL之間有一些相似之處,因?yàn)樗鼈兌际侵С挚蓴U(kuò)展方法集的通用框架。但是,EAP定義了一個(gè)特定的有線協(xié)議,而SASL沒(méi)有定義。此外,EAP旨在支持網(wǎng)絡(luò)訪問(wèn)應(yīng)用程序,而SASL旨在支持應(yīng)用程序級(jí)別的身份驗(yàn)證應(yīng)用程序。
但是,關(guān)于EAP的最重要的一點(diǎn)是,它從一開(kāi)始就被設(shè)計(jì)為可被應(yīng)用程序服務(wù)器不透明地經(jīng)隧道傳輸。例如,假設(shè)你通過(guò)調(diào)制解調(diào)器撥入路由器,并建立PPP連接。路由器必須了解協(xié)議(例如PAP或CHAP),并且知道如何通過(guò)RADIUS或DIAMETER與后端服務(wù)器交互協(xié)議。
在現(xiàn)代應(yīng)用程序中,例如Wi-Fi客戶端對(duì)一個(gè)WLAN接入點(diǎn)發(fā)送EAP,接入點(diǎn)只會(huì)將EAP消息作為不透明數(shù)據(jù),然后將其在RADIUS或DIAMETER會(huì)話中通過(guò)隧道傳輸?shù)揭粋€(gè)網(wǎng)絡(luò)身份驗(yàn)證服務(wù)器上,讓網(wǎng)絡(luò)身份驗(yàn)證服務(wù)器來(lái)處理EAP消息。身份驗(yàn)證服務(wù)器同樣可以返回封裝在RADIUS或DIAMETER會(huì)話中的EAP消息,Wi-Fi接入點(diǎn)將其解包并傳遞給客戶端。這樣,網(wǎng)絡(luò)設(shè)備就與所使用的身份驗(yàn)證方法無(wú)關(guān),并且不需要升級(jí)就能支持新的身份驗(yàn)證方法。只有驗(yàn)證服務(wù)器和客戶端需要升級(jí)。
請(qǐng)注意,客戶端永遠(yuǎn)不會(huì)發(fā)送RADIUS或DIAMETER。RADIUS和DIAMETER是嚴(yán)格的后端協(xié)議。因?yàn)镋AP消息始終在轉(zhuǎn)發(fā)到身份驗(yàn)證服務(wù)器之前被封裝在RADIUS或DIAMETER消息中(身份驗(yàn)證客戶端無(wú)法控制的進(jìn)程),所以RADIUS或DIAMETER消息可以包括與EAP無(wú)關(guān)的,身份驗(yàn)證服務(wù)器感興趣的客戶端信息消息本身。例如,如果客戶端正在為啟用802.1x的以太網(wǎng)端口發(fā)起驗(yàn)證,則交換機(jī)可以包含關(guān)于客戶端連接到哪個(gè)端口的信息,并且身份驗(yàn)證服務(wù)器可以預(yù)見(jiàn)它在這上面的決策。
單點(diǎn)登錄協(xié)議
現(xiàn)在,我們討論最復(fù)雜,最有趣的身份驗(yàn)證協(xié)議:?jiǎn)吸c(diǎn)登錄協(xié)議。如前所述,單點(diǎn)登錄協(xié)議必須包括兩個(gè)部分:用于驗(yàn)證客戶端到驗(yàn)證服務(wù)器的協(xié)議,以及用于驗(yàn)證客戶端到任意應(yīng)用程序服務(wù)器的協(xié)議。前者可能是標(biāo)準(zhǔn)的客戶端到應(yīng)用程序協(xié)議,也可能是定制的協(xié)議。而SSO協(xié)議的性質(zhì)要求后者是SSO協(xié)議所特有的,并且是任何SSO協(xié)議的核心。
單點(diǎn)登錄協(xié)議:非Web
SSO協(xié)議可以大致分為Web和非Web SSO協(xié)議。最受歡迎的非Web SSO協(xié)議是Kerberos。
Kerberos允許客戶端使用定制的身份驗(yàn)證協(xié)議向身份驗(yàn)證服務(wù)器發(fā)起身份驗(yàn)證;客戶端會(huì)收到一個(gè)票證,該票證能以密碼方式向應(yīng)用程序服務(wù)器發(fā)起身份驗(yàn)證,而無(wú)需與Kerberos身份驗(yàn)證服務(wù)器之間進(jìn)一步的通信(驗(yàn)證服務(wù)器在用戶登錄后可能會(huì)關(guān)閉,并且不會(huì)立即讓所有應(yīng)用程序無(wú)法訪問(wèn))。
該協(xié)議還支持客戶端來(lái)驗(yàn)證服務(wù)器,以及服務(wù)器來(lái)驗(yàn)證客戶端。如今,*nix和Windows Active Directory環(huán)境都使用Kerberos。對(duì)于客戶端到應(yīng)用程序的身份驗(yàn)證,通常不直接在身份驗(yàn)證框架內(nèi)將其實(shí)現(xiàn)為身份驗(yàn)證方法。
相反,它通常是通過(guò)GSSAPI調(diào)用的,并且是主要的用法,例如SASL GSSAPI方法、HTTP Negotiate(GSSAPI)身份驗(yàn)證方法和SSH GSSAPI身份驗(yàn)證方法。
有趣的是,Kerberos的當(dāng)前版本Kerberos 5于1993年發(fā)布,因此僅依賴對(duì)稱加密,避免了對(duì)非對(duì)稱加密的依賴。如果Kerberos是今天設(shè)計(jì)的,則它可能會(huì)使用公鑰加密,并且對(duì)中心化身份驗(yàn)證服務(wù)器的依賴會(huì)稍少一些。
不幸的是,Web的極速增長(zhǎng)看來(lái)已經(jīng)侵蝕了所有非web協(xié)議(無(wú)論是身份驗(yàn)證還是其他用途)的發(fā)展空間。(但Kerberos 5仍然是安全的。)
單點(diǎn)登錄協(xié)議:Web
對(duì)于Web SSO協(xié)議,客戶端到身份驗(yàn)證服務(wù)器協(xié)議一直是標(biāo)準(zhǔn)的Web形式,也就是表單-cookies形式。客戶端到應(yīng)用程序服務(wù)器的身份驗(yàn)證協(xié)議卻很特殊。
通常,當(dāng)應(yīng)用程序服務(wù)器希望對(duì)客戶端進(jìn)行身份驗(yàn)證時(shí),它將通過(guò)HTTP重定向?qū)⒖蛻舳艘騍SO身份驗(yàn)證服務(wù)器。如果客戶端尚未通過(guò)中心化驗(yàn)證,則會(huì)要求它進(jìn)行驗(yàn)證;否則,如果客戶端已經(jīng)完成單點(diǎn)登錄,則流程將繼續(xù)進(jìn)行而無(wú)需用戶干預(yù)。
在對(duì)用戶完成身份驗(yàn)證之后,身份驗(yàn)證服務(wù)器會(huì)通過(guò)另一個(gè)HTTP重定向?qū)⒖蛻舳艘氐綉?yīng)用程序服務(wù)器。返回請(qǐng)求包含從身份驗(yàn)證服務(wù)器傳輸?shù)綉?yīng)用程序服務(wù)器的身份驗(yàn)證信息,以建立客戶端的憑據(jù)。該數(shù)據(jù)本身將以某種方式進(jìn)行身份驗(yàn)證,以防止客戶端對(duì)其修改。由于信息從身份驗(yàn)證服務(wù)器到應(yīng)用程序服務(wù)器的傳遞是通過(guò)客戶端進(jìn)行的,因此客戶端就像是攜帶花粉的蜜蜂。在某些SSO實(shí)現(xiàn)中,應(yīng)用程序服務(wù)器可以直接回調(diào)身份驗(yàn)證服務(wù)器,以驗(yàn)證它已通過(guò)客戶端接收到的信息。在其他SSO實(shí)現(xiàn)中,通過(guò)客戶端從身份驗(yàn)證服務(wù)器傳遞到應(yīng)用程序服務(wù)器的信息是加密保護(hù)的,不需要進(jìn)一步驗(yàn)證。
應(yīng)當(dāng)注意,上文不是對(duì)特定SSO協(xié)議的描述,而是對(duì)所有常用技術(shù)的概括。由于Web應(yīng)用程序僅需要符合標(biāo)準(zhǔn)的Web瀏覽器,因此對(duì)在Web平臺(tái)之上實(shí)現(xiàn)的協(xié)議進(jìn)行標(biāo)準(zhǔn)化的要求較少,于是出現(xiàn)了許多專有的Web SSO實(shí)現(xiàn)。
但一些標(biāo)準(zhǔn)還是出現(xiàn)了。今天流行的標(biāo)準(zhǔn)有:
- SAML2,安全性斷言標(biāo)記語(yǔ)言第2版,一種XML的誤用,用于表達(dá)加密簽名語(yǔ)句,語(yǔ)句中包含受驗(yàn)證方和驗(yàn)證用途的信息,并在域之間傳遞此類語(yǔ)句。它很流行,受AWS for SSO支持。
- OAuth,一種基于HTTP的協(xié)議,用于促成網(wǎng)站之間的授權(quán)流。它側(cè)重于授權(quán)而非驗(yàn)證,但是現(xiàn)在也經(jīng)常用于驗(yàn)證,尤其是與OpenID Connect擴(kuò)展一起使用時(shí)。它很流行,受AWS for SSO支持。OpenID Connect擴(kuò)展添加了身份驗(yàn)證功能,并允許在身份驗(yàn)證期間將用戶信息(例如電子郵件地址等)傳遞到網(wǎng)站。(請(qǐng)注意,OpenID Connect是一種位于OAuth之上的技術(shù),與OpenID 2沒(méi)有任何關(guān)系。)
曾經(jīng)被廣泛采用,但現(xiàn)在已經(jīng)過(guò)時(shí)的協(xié)議包括:
- OpenID2,一種Web SSO協(xié)議,它使人們可以驗(yàn)證對(duì)特定URL的控制。(請(qǐng)注意,這與基于OAuth構(gòu)建的OpenID Connect無(wú)關(guān),兩者適用的用例差異巨大。)
- LID,一種Web SSO協(xié)議,與OpenID 2類似,是OpenID 2的同期競(jìng)爭(zhēng)對(duì)手,但是不太流行。
本地API
最后我們討論一些系統(tǒng)本地身份驗(yàn)證API。這些不是協(xié)議,但與協(xié)議關(guān)系很近。
PAM
PAM(可插入身份驗(yàn)證模塊)是nix領(lǐng)域中本地身份驗(yàn)證的事實(shí)標(biāo)準(zhǔn)。它在linux上普遍用于本地身份驗(yàn)證,并且在其他nix操作系統(tǒng)上也很流行。PAM提供了基于插件的身份驗(yàn)證功能;PAM插件是動(dòng)態(tài)鏈接庫(kù),可以在運(yùn)行時(shí)加載以提供任意身份驗(yàn)證邏輯。使用何種PAM插件由系統(tǒng)配置確定,因此可以根據(jù)需要重新配置PAM。
盡管PAM具有高度可擴(kuò)展性,但它被設(shè)計(jì)為支持終端交互式登錄應(yīng)用程序,因此受到了限制。PAM模塊向用戶提交一系列零個(gè)或多個(gè)交互式提示(例如“Password:”),因此不能支持Kerberos那樣的SSO身份驗(yàn)證方法(盡管有的PAM模塊可以提示用戶輸入Kerberos密碼并執(zhí)行初始Kerberos登錄)。
雖然PAM主要是為了支持終端交互式登錄而設(shè)計(jì)的,但將PAM用作某些應(yīng)用程序協(xié)議的后端(例如,用作SASL PLAIN的后端)也是可行且普遍的。但是,這要求應(yīng)用程序服務(wù)器理解(或正確猜測(cè))PAM模塊發(fā)出的線路提示的語(yǔ)義。例如,Dovecot IMAP服務(wù)器假定,如果PAM模塊要求輸入沒(méi)有字符回顯的行,則說(shuō)明它要求輸入密碼;如果該模塊要求輸入一行啟用了字符回顯的內(nèi)容,則它是在要求用戶名。因此,雖然PAM模塊可以被編寫(xiě)為支持通過(guò)TOTP硬件密鑰進(jìn)行身份驗(yàn)證,并在終端上提示輸入六位數(shù)的值,但非終端應(yīng)用程序(例如SASL應(yīng)用程序)無(wú)法支持它,除非專門(mén)設(shè)計(jì)為支持這種模塊的提示。
GSSAPI
GSSAPI是另一個(gè)本地API,具有正式標(biāo)準(zhǔn)。它設(shè)計(jì)用于網(wǎng)絡(luò)應(yīng)用程序(而不是終端交互),并且最常用于通過(guò)Kerberos SSO啟用身份驗(yàn)證。實(shí)際上,盡管它是旨在擴(kuò)展到任意身份驗(yàn)證方案的通用API,但它幾乎只被用于Kerberos、SPNEGO和NTLM應(yīng)用程序。可以通過(guò)SASL GSSAPI方法,通過(guò)任何SASL應(yīng)用程序使用GSSAPI。
原文鏈接:
https://www.devever.net/~hl/auth






