[轉]asp.net權限認證:摘要認證(digest authentication)
本文轉自:http://www.cnblogs.com/lanxiaoke/p/6357501.html
摘要認證簡單介紹
摘要認證是對基本認證的改進,即是用摘要代替賬戶密碼,從而防止明文傳輸中賬戶密碼的泄露
之前對摘要認證也不是很熟悉,還得感謝圓中的 parry 貢獻的博文:ASP.NET Web API(三):安全驗證之使用摘要認證(digest authentication)
我是覺得真心不錯,讓我少走很多彎路。這篇文章主要是對上邊引用文章的講解,老司機可以略過。
老規矩,上摘認證的工作流程圖
看圖大概可以知道摘要認證的步驟
客戶端請求資源 api/employees
後臺認證邏輯,返回401
數據提交後,服務端檢查Headers中的Authorization信息,null值就返回401,提示需要認證,認證格式為Digest,同時返回的還有realm、nonce、qop這幾個參數值
1、realm的值可以隨意;nonce為隨機數,一般是GUID格式的字符串,需要後臺返回;qop的之分布有三種:沒有定義(即空值)、auth、auth-int
2、後臺處理過程:
3、返回的報文頭信息是這樣:
HTTP /1.1 401 Unauthorized
WWW-Authenticate:Digest
realm= ”RealmOfBadri”
nonce=”75d1c31e6d3b28f100edac595a53cf96”
客戶端授權開始
接受到反饋後,知道資源需要授權才能訪問;於是開始輸入username、password
這裏有個地方需要註意,項目默認是賬戶名密碼一致才能驗證通過的,看代碼
點擊登錄,查看後臺得到的數據
看圖可以知道
realm、qop、nonce是服務器上次生成的值
username是我們輸入的頁面
uri是客戶端要請求的地址
nc、cnonce是客戶端自動生成的值
response是最終要傳送的摘要信息,也是客戶端生成的
是不是發現了什麽不對?密碼去哪了?
其實這就是摘要認證的精髓了,不傳送明文密碼,只傳送摘要信息
有同學可能要問,不傳輸密碼,那服務端如何知道輸入的用戶名稱就是屬於當前操作用戶呢
那接下來就得摘要信息出場了,我們來看看如何生成摘要信息
對(username:realm:password)進行HASH運算,得到HA1
對(方法名:請求的路徑)進行HASH運算,即(GET:http://localhost:32934/api/employees),得到HA2
最終得到摘要信息response = 對(HA1:nonce:nc:cnonce:qop:HA2)進行HASH運算
後臺參數解析
分析完前端,我們看看服務端如何解析這些參數的
其實服務端的工作就是根據客戶端端傳送過來的realm、qop、nonce、username、uri、nc、cnonce進行HASH運行得到新的摘要信息response2
如何用response2與客戶端生成的response進行比較,如果一致,就說明認證通過;不一致,就繼續返回401
主要就是這一段代碼處理
因為對於服務端來說HA1:nonce:nc:cnonce:qop:HA2中除了HA1中的password沒有從客戶端得到,其他所有所有參數都得到了
所以摘要認證的核心就是:
對於客戶端:我知道用戶名稱和密碼和(一些認證的約束,即realm、qop、nonce之類),從而得到加密信息response
對於服務端:我知道用戶名稱和(一些認證的約束,即realm、qop、nonce之類),然後根據用戶名稱去數據庫找到用戶的密碼,從而得到加密信息response2
最後比較response:response2,如果客戶端輸入的密碼和數據庫根據用戶名稱查到的密碼一致,就肯定能認證通過。
最後需要提醒大家的地方,這個用戶密碼可以跟賬號登錄密碼不一致,可以分成2個字段;你可以理解為:用戶名+認證密碼
因為認證密碼即使是加密的也必須可逆,不然後臺匹配不了
摘要認證測試
web端的摘要認證就是上邊那樣。
但是很多情況客戶端不是通過瀏覽器訪問的資源,比如通過一段程序去訪問 api/employees,
這時候並不存在像瀏覽器彈出認證窗口的交互動作,這時候怎麽搞?
其實也是很簡單的,我們新建控制臺項目 DigestTest
然後通過WebClient對象去訪問資源文件
最後運行程序,就可以看到返回的數據
提示未經授權,因為我們的認證賬戶是錯的,改成1111:1111,再試試
OK,完全沒有問題
好了,搞定收工!
asp.net權限認證系列
- asp.net權限認證:Forms認證
- asp.net權限認證:HTTP基本認證(http basic)
- asp.net權限認證:Windows認證
- asp.net權限認證:摘要認證(digest authentication)
- asp.net權限認證:OWIN實現OAuth 2.0 之客戶端模式(Client Credential)
- asp.net權限認證:OWIN實現OAuth 2.0 之密碼模式(Resource Owner Password Credential)
- asp.net權限認證:OWIN實現OAuth 2.0 之授權碼模式(Authorization Code)
- asp.net權限認證:OWIN實現OAuth 2.0 之簡化模式(Implicit)
分類: 權限認證
[轉]asp.net權限認證:摘要認證(digest authentication)