閱讀379 返回首頁    go 阿裏雲 go 技術社區[雲棲]


[WCF安全係列]認證與憑證:用戶名/密碼認證與Windows認證

如果要給認證下一個定義,我個人的傾向這樣的定義:認證是確定被認證方的真實身份和他或她申明(Claim)的身份是否相符的行為。認證方需要被認證方提供相應的身份證明材料,以鑒定本身的身份是否與聲稱的身份相符。在計算機的語言中,這裏的身份證明有一個專有的名稱,即“憑證(Credential)”,或者用戶憑證(User Credential)、認證憑證(Authentication Credential)。

最好的設計就是能夠盡可能的模擬現實的設計。對於安全認證來說,在現實生活中有無數現成的例子。比如我對一個不認識的人說:“我是張三”,對方如何才能相信我真的是張三而非李四呢?雖然我們未必全都是有身份的人,但無疑我們都是有身份證的人,身份證可以證明我們的真實身份。而這裏的身份證就是一種典型的憑證。認證方能夠根據被認證方提供的身份證識別對方的真實身份,必須滿足三個條件:

  • 被認證人聲稱是身份證上注明的那個人;
  • 身份證的持有者就是身份證的擁有者;
  • 身份證本身是合法有效的,即是通過公安機關頒發的,而不是通過撥打“辦證”電話辦理的。

第一個問題一般不是問題,因為對於一個神經稍微正常的人來說,他不會拿著李四的身份證去證明自己是張三;第二個問題可以根據身份證上麵的照片來判斷;第三個問題就依賴於身份證本身的防偽標識和認證方的鑒別能力了。

上述的三個條件本質上也反映了認證過程中用戶憑證本身應該具有的屬性,以及用戶憑證和被認證人之間的關係。即:憑證與聲明的一致性被認證人對憑證的擁有性,以及憑證的合法性。為了簡單,我們不妨簡稱為用戶憑證的三個屬性。用戶憑證的類型決定了認證的方式,WCF支持一係列不同類型的用戶憑證,以滿足不同認證需求。接下來,我們來簡單介紹幾種使用比較普遍的憑證以及相應的認證方式。

我們最常使用的認證方式莫過於采用驗證用戶名和密碼的形式,以致於我們提到身份驗證,很多人會想到密碼。我們不妨通過上麵我們講到的用戶憑證的三屬性來分析用戶名/密碼憑證。

用戶名表示被認證方聲明的身份(Identity),密碼是持有人是憑證合法擁有者的證據。對於認證方來說,由於賬號對應的密碼屬於賬號擁有者的私密信息,如果被認證方能夠提供與他聲明身份相匹配的密碼,就能夠證明對方確實與他聲明的是同一個人。首先,用戶名代表身份(Identify),憑證與聲明的一致性意味著被認證方聲明的身份與用戶名一致。被認證人對憑證的擁有性通過密碼證明,密碼屬於絕對隱私信息,被認證人如果能夠提供與所聲明的身份相匹配的密碼,就能夠證明他是憑證的真正擁有者;由於用戶名/密碼憑證不屬於證書型憑證,不需要合法機構頒發,對於合法性則無從說起。

在采用用戶名/密碼認證方式的應用中,認證方一般具有所有用戶帳號和密碼的列表。當然,由於密碼對屬於持有人的絕對隱私,原則上僅限於持有人本人知曉,其他人任何人(當然也包括認證方)不應該采用技術手段獲知該密碼。如果認證方維護者他負責認證的所有帳戶的用戶名和密碼的列表,被存儲的一般是原始密碼的哈希值以及進行哈希運算采用的Key。由於哈希算法是不可逆的,所以無法通過後哈希的值和相應的Key得到原始的值,從而確保了密碼的安全性。在進行認證的時候,隻需要根據用戶名找到相應的Key,然後利用該Key采用相同的算法對用戶提供的密碼進行哈希算法,最終將最終的運算結果和本地存儲的值進行比較即可驗證密碼的真偽。

雖然在我們進行項目開發的時候,我們也會選擇對用戶注冊時提供的密碼進行加密存儲,這樣可以讓用戶忘記原來的密碼的時候,通過向認證方證明其真實身份的前提下,讓認證方通過通過解密返回其原來的密碼。對於密碼的加密存儲問題,無論是采用對稱加密還是非對稱加密,我們都可以通過相應的解密算法得到其原始密碼,所以從理論上講具有安全問題。不過,具體應用在選擇密碼存儲策略的時候,可以根據自身所需的安全級別以及是否需要返回原始密碼,選擇對原始密碼進行哈希或者加密。但是,無論如何對密碼進行明文存儲是不被允許的。

如果你選擇了用戶名/密碼憑證,WCF為你提供了三種認證模式:

  • 將用戶名映射為Windows帳號,采用Windows認證;
  • 采用ASP.NET的成員資格(Membership)模塊
  • 通過繼承UserNamePasswordValidator,實現自定義認證。

應該說就采用的頻率程度,集成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數字證書的憑證。


作者:蔣金楠
微信公眾賬號:大內老A
微博:www.weibo.com/artech
如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識別二維碼)關注個人公眾號(原來公眾帳號蔣金楠的自媒體將會停用)。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁麵明顯位置給出原文連接,否則保留追究法律責任的權利。
原文鏈接

最後更新:2017-10-27 11:04:09

  上一篇:go  [WCF安全係列]從兩種安全模式談起
  下一篇:go  [WCF安全係列]認證與憑證:X.509證書