標籤:核心 改進 訪問 local 流程圖 博文 tail 報文頭 作用
asp.net許可權認證系列
asp.net許可權認證:Forms認證
asp.net許可權認證:HTTP基本認證(http basic)
asp.net許可權認證:Windows認證
asp.net許可權認證:摘要認證(digest authentication)
一、摘要認證由來
摘要認證是對基本認證的改進,即是用摘要代替賬戶密碼,從而防止明文傳輸中賬戶密碼的泄露
之前對摘要認證也不是很熟悉,還得感謝圓中的 parry 貢獻的博文:ASP.NET Web API(三):安全驗證之使用摘要認證(digest authentication)
我是覺得真心不錯,讓我少走很多彎路。這篇文章主要是對上邊引用文章的講解,老司機可以略過。
老規矩,上摘認證的工作流程圖
看圖大概可以知道摘要認證的步驟
1、用戶端請求資源 api/employees,項目中即是點擊details按鈕
2、資料提交後,服務端檢查Headers中的Authorization資訊,null值就返回401,提示需要認證,認證格式為Digest,同時返回的還有realm、nonce、qop這幾個參數值
2.1、realm的值可以隨意;nonce為隨機數,一般是GUID格式的字串,需要後台返回;qop的之分布有三種:沒有定義(即空值)、auth、auth-int
2.2、幕後處理過程:
2.3、返回的報文頭資訊是這樣:
HTTP /1.1 401 Unauthorized
WWW-Authenticate:Digest
realm= ”RealmOfBadri”
qop=“auth”
nonce=”75d1c31e6d3b28f100edac595a53cf96”
3、用戶端接受到反饋後,知道資源需要授權才能訪問;於是開始輸入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運算
4、分析完前端,我們看看服務端如何解析這些參數的
其實服務端的工作就是根據用戶端端傳送過來的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個欄位;你可以理解為:使用者名稱+認證密碼
因為認證密碼即使是加密的也必須可逆,不然後台匹配不了
好了,收工!
asp.net許可權認證:摘要認證(digest authentication)