如果要給認證下一個定義,我個人的傾向這樣的定義:認證是確定被認證方的真實身份和他或她申明(Claim)的身份是否相符的行為。認證方需要被認證方提供相應的身份證明材料,以評鑑本身的身份是否與聲稱的身份相符。在電腦的語言中,這裡的身份證明有一個專有的名稱,即“憑證(Credential)”,或者使用者憑證(User Credential)、認證憑證(Authentication Credential)。
一、憑證的屬性
最好的設計就是能夠儘可能的類比現實的設計。對於安全認證來說,在現實生活中有無數現成的例子。比如我對一個不認識的人說:“我是張三”,對方如何才能相信我真的是張三而非李四呢?雖然我們未必全都是有身份的人,但無疑我們都是有身份證的人,身份證可以證明我們的真實身份。而這裡的身份證就是一種典型的憑證。認證方能夠根據被認證方提供的身份證識別對方的真實身份,必須滿足三個條件:
- 被認證人聲稱是身份證上註明的那個人;
- 身份證的持有人就是身份證的擁有者;
- 身份證本身是合法有效,即是通過公安機關頒發的,而不是通過撥打“辦證”電話辦理的。
第一個問題一般不是問題,因為對於一個神經稍微正常的人來說,他不會拿著李四的身份證去證明自己是張三;第二個問題可以根據身份證上面的照片來判斷;第三個問題就依賴於身份證本身的防偽標識和認證方的鑒別能力了。
上述的三個條件本質上也反映了認證過程中使用者憑證本身應該具有的屬性,以及使用者憑證和被認證人之間的關係。即:憑證與聲明的一致性,被認證人對憑證的擁有性,以及憑證的合法性。為了簡單,我們不妨簡稱為使用者憑證的三個屬性。使用者憑證的類型決定了認證的方式,WCF支援一系列不同類型的使用者憑證,以滿足不同認證需求。接下來,我們來簡單介紹幾種使用比較普遍的憑證以及相應的認證方式。
二、使用者名稱/密碼認證
我們最常使用的認證方式莫過於採用驗證使用者名稱和密碼的形式,以致於我們提到身分識別驗證,很多人會想到密碼。我們不妨通過上面我們講到的使用者憑證的三屬性來分析使用者名稱/密碼憑證。
使用者名稱表示被認證方聲明的身份(Identity),密碼是持有人是憑證合法擁有者的證據。對於認證方來說,由於帳號對應的密碼屬於帳號擁有者的私密資訊,如果被認證方能夠提供與他聲明身份相匹配的密碼,就能夠證明對方確實與他聲明的是同一個人。首先,使用者名稱代表身份(Identify),憑證與聲明的一致性意味著被認證方聲明的身份與使用者名稱一致。被認證人對憑證的擁有性通過密碼證明,密碼屬於絕對隱私資訊,被認證人如果能夠提供與所聲明的身份相匹配的密碼,就能夠證明他是憑證的真正擁有者;由於使用者名稱/密碼憑證不屬於認證型憑證,不需要合法機構頒發,對於合法性則無從說起。
在採用使用者名稱/密碼認證方式的應用中,認證方一般具有所有使用者帳號和密碼的列表。當然,由於密碼對屬於持有人的絕對隱私,原則上僅限於持有人本人知曉,其他人任何人(當然也包括認證方)不應該採用技術手段獲知該密碼。如果認證方維護者他負責認證的所有帳戶的使用者名稱和密碼的列表,被儲存的一般是原始密碼的雜湊值以及進行雜湊運算採用的Key。由於雜湊演算法是無法復原的,所以無法通過後雜湊的值和相應的Key得到原始的值,從而確保了密碼的安全性。在進行認證的時候,只需要根據使用者名稱找到相應的Key,然後利用該Key採用相同的演算法對使用者提供的密碼進行雜湊演算法,最終將最終的運算結果和本機存放區的值進行比較即可驗證密碼的真偽。
雖然在我們進行項目開發的時候,我們也會選擇對使用者註冊時提供的密碼進行加密儲存,這樣可以讓使用者忘記原來的密碼的時候,通過向認證方證明其真實身份的前提下,讓認證方通過通過解密返回其原來的密碼。對於密碼的加密儲存問題,無論是採用對稱式加密還是非對稱式加密,我們都可以通過相應的解密演算法得到其原始密碼,所以從理論上講具有安全問題。不過,具體應用在選擇密碼儲存策略的時候,可以根據自身所需的安全層級以及是否需要返回原始密碼,選擇對原始密碼進行雜湊或者加密。但是,無論如何對密碼進行明文儲存是不被允許的。
如果你選擇了使用者名稱/密碼憑證,WCF為你提供了三種認證模式:
- 將使用者名稱對應為Windows帳號,採用Windows認證;
- 採用ASP.NET的成員資格(Membership)模組
- 通過繼承UserNamePasswordValidator,實現自訂認證。
三、Windows認證
應該說就採用的頻率程度,整合Windows認證(IWA:Integrated Windows Authentication)是僅次於使用者名稱/密碼的認證方式。尤其是在基於Windows活動目錄(AD:Active Directory)的Intranet應用來說,Windows認證更是成為首選。微軟幾乎所有需要進行認證的產品或者開發平台都整合了Windows認證,比如IIS,SQL Server,ASP.NET等,當然,WCF也不可能例外。
Windows是實現單點登入(SSO:Single Sign-On)最理想的方式。無論是採用域(Domain)模式還是工作群組(Workgroup)模式,只要你以Windows帳號和密碼登入到某一台機器,你就會得到一個憑證。在當前會話逾時之前,你就可以攜帶該Windows憑證,自動登入到整合了Windows認證方式的所有應用,而無須頻繁地輸入相同的Windows帳號和密碼。如果登入帳號不具有操作目標應用的許可權,在一般情況下,你好可以通過重新輸入Windows帳號和相應的密碼(如果目前使用者具有多個Windows帳號)以另外一個身份(該身份具有對目標應用進行操作的存取權限)對目標應用進行操作。
就其實現來說,Windows具有兩種不同的認證協議,即NTLM(NT LAN Manager)和Kerberos。關於這兩種認證機制大體上的原理,可以參考我寫的兩篇文章:
Windows安全認證是如何進行的?[Kerberos篇]
Windows安全認證是如何進行的?[NTLM篇]
在《下篇》中,我們著重討論基於X.509數位憑證的憑證。