【W(wǎng)CF】使用“用戶名/密碼”驗證的合理方法
我不敢說俺的方法是最佳方案,反正這世界上很多東西都是變動的,正像老子所說的——“反(返)者,道之動”。以往看到有些文章中說,為每個客戶端安裝證書嫌麻煩,就直接采用把用戶名和密碼塞在SOAP頭中發(fā)送,然后在服務器端自定義一個消息攔截器來驗證用戶名和密碼。
以老周不靠譜的學識水平認為,這樣做不好,直接把明文而且敏感信息放在SOAP頭中傳輸,這尺度實在太大了,太暴露了,廣電局是不會允許的,雖然現(xiàn)在流行穿得越少越好,但那些是婊子的境界。像用戶名密碼這些重要信息,怎么能直接傳輸呢,這很容易被偷窺的。
其實,WCF并不要求客戶端必須安裝服務器證書。證書就好比身份證,用來標識你的身份的,所以你不能拿著你外公的身份證去實名買火車票,除非售票的人是傻逼才會賣給你。
一般來說,傳輸層的安全是不需要提供證書的,但是消息安全是要求服務器提供證書的,客戶端可以以證書為憑據(jù),也可以不提供,即只對服務器有要求,客戶端可選擇其他憑據(jù),如Windows驗證。經(jīng)過老周試驗,如果客戶端憑據(jù)為Windows,那么服務器也可以不設置證書的。不過,對用戶名/密碼驗證方式,服務器必須提供證書。
說白了,根本不必為每個客戶端安裝服務器證書,完全不應該把用戶名密碼放在Header里面,那樣太危險。
說再多廢話意義不大,還是來個例子有用。
要實現(xiàn)自定義的用戶名密碼驗證,需要實現(xiàn)一個抽象類——UserNamePasswordValidator。
class CustUsernamepwdValidator : UserNamePasswordValidator { public override void Validate(string userName, string password) { if (userName != "