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


摘要認證簡單介紹

摘要認證是對基本認證的改進,即是用摘要代替賬戶密碼,從而防止明文傳輸中賬戶密碼的泄露

之前對摘要認證也不是很熟悉,還得感謝圓中的 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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM