1. 程式人生 > >[轉]asp.net權限認證:摘要認證(digest authentication)

[轉]asp.net權限認證:摘要認證(digest authentication)

imp 2個 端端 不一致 輸入 解析 操作 hash ostc

本文轉自: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”

qop=“auth”
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權限認證系列

  1. asp.net權限認證:Forms認證
  2. asp.net權限認證:HTTP基本認證(http basic)
  3. asp.net權限認證:Windows認證
  4. asp.net權限認證:摘要認證(digest authentication)
  5. asp.net權限認證:OWIN實現OAuth 2.0 之客戶端模式(Client Credential)
  6. asp.net權限認證:OWIN實現OAuth 2.0 之密碼模式(Resource Owner Password Credential)
  7. asp.net權限認證:OWIN實現OAuth 2.0 之授權碼模式(Authorization Code)
  8. asp.net權限認證:OWIN實現OAuth 2.0 之簡化模式(Implicit)

分類: 權限認證

[轉]asp.net權限認證:摘要認證(digest authentication)