在實際的系統中,往往要自訂基於資料庫的認證系統,比如你的WebService要給你的供應商或者客戶調用,你要管理他們的帳號和許可權。顯然基於認證、Windows和Passport的驗證都不理想,ASP.net中支援自訂的只有Form認證。我們知道Fom認證要在網路中傳輸純文字密碼,要安全只有依靠SSL通訊。
上面提到的幾種認證方式都是Asp.net原生的,可以利用IPrincipal。.Net中有四種方式可以利用IPrincipal作許可權檢查, 在Web設定和代碼中都很方便。
怎麼增加更安全的登入方式,又能利用IPrincipal呢?
第一種:傳送加密後的密碼。
定義一個Login WebService, 當然是允許匿名訪問的。比較使用者提交的Hash過的密碼,成功後調用System.web.security.FormsAuthentication中的靜態方法來登入,設定認證Cookie給用戶端。在後續使用者請求時根據Cookie判斷使用者是否登入過。
優點:
密碼一次Hash,計算量少
缺點:
要求WS用戶端使用Cookie(問題不大)
安全性不強,如果有人偵聽到加密後的密碼,可以模仿攻擊
第二種:利用摘要認證(Digest Authentication)
在IIS中文摘認證只能基於Windows賬戶,包括基本認證,給人的錯覺是他們是Windows家族的,你要用安全的認證方式,必須用Windows帳號。實際上他們是rfc2617標準,沒有必要和Windows賬戶綁定。
在asp.net中實現摘要認證需要利用Filter概念,類似ISAPI.
優點:
可以同時用於aspx和asmx的保護
可以利用瀏覽器的密碼儲存和Session管理。
安全性強
缺點:
每次訪問都要多次計算Hash
需要用戶端支援摘要認證(似乎也不是問題)
實際上以上兩種認證方式可以合并在一個模組中,根據需要靈活選用。
參考資料:
http://blog.joycode.com/zjf/posts/16737.aspx
http://www.eggheadcafe.com/articles/20030701.asp
http://gensystem.europe.webmatrixhosting.net/al/articles/147.aspx
懸案問題:
摘要認證怎麼Logout?
Ream是使用者無關的?
HttpHeader中文亂碼
身份傳遞