最近想重寫以前的一個舊系統,並把架構拆的更細,畢竟舊有系統還能正常 run ,想趁著作新系統構想並解決一些常見的問題
那以前的架構不是說不好,只是我喜歡玩新玩具,就趁著改寫時順便玩各種沒玩過的東西
(畢竟工作時,能達到需求的程式就是好程式,可是那時可能都是為了某些東西趕著上去,其實整個很凌亂)
我想在進入正題前,還是得介紹一下 WCF ,或許有人曾開發過 Web Service 方案,那 WCF 其實跟他很類似,但 WCF 更強大的地方是在可以用 Web 通訊與其它支援 SOAP 的平台互相溝通
其實很多落落長的網路上 Google 就有了(表示這隻突然發懶了(被打~)),然後老實說其實我目前改寫成 WCF 的專案,他就算沒用 WCF 技術也是 ok 的,原因是那系統目前只有我一個人在維護,我不需要跟其它人寫的其它程式作溝通
但像我昨天跟朋友說的「別再說沒機會、沒動機了,玩就對了」,我還是直接跳下去玩了XD
好吧,回歸主題,今天要講的是我研究了差不多半天的東西,WCF的使用者驗證,其實很簡單兩小時就能搞定,不過中間我又是找資料又是架 Redmine 的,時間就被我浪費掉了XD,至於 Redmine 我再找時間來寫好了,只是我用的是懶人版,所以也沒啥好寫的就是了(笑~
上面是大概就是我的驗證登入的程式碼了,他會取出傳入的帳號及密碼,並到資料庫中查詢確認該用戶是否存在,如不存在則丟出 Wrong username or password 的錯誤訊息!其中 UserNamePasswordValidator 類別是在 System.IdentityModel.Selectors 命名空間中,而該命名空間需參考 System.IdentityModel.dll
之後就要設定其 web.config ,讓系統可以驗證登入,主要修改的都是在 <system.serviceModel> 標籤裡面,我們有作帳號密碼的登入要求,所以需要加入(更改) bindings 標籤裡的內容
主要是要求安全性為 Message ,並且 clientCredentialType 指定為 UserName
接下來則是 設定其 behaviors/serviceBehaviors ,系統預設在裡面會新增一個 behavior ,使 wcf 可以使用 https 或 https 方法取得內容,並且打開 includeExceptionDetailInFaults 以便偵錯
而我則在預設下面再新增一個需要使用者登入的行為
最後則指定服務使用的行為及 binding,其內容要加在 services 裡面
透過這樣的新增,他就能產生一個需要驗證登入的服務了,當然還沒完,在 behavor 設定中有個 serviceCertificate ,那裡面的值就是一個 X509 的簽證,那你電腦沒有那簽證一定會發生問題,所以啦,我們還要下指令產生簽證給電腦,指令語法如下:
makecert -sk ServCert -n "CN=MyCert" -pe -sr LocalMachine -ss My -a sha1 -r -sky exchange
透過以上的指令就能產生一個本機的臨時簽證了,但他畢竟沒經過第三方單位簽署過,所以在後來呼叫 wcf service 時,得把該 wcf 物件中的 ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode 設為 System.ServiceModel.Security.X509CertificateValidationMode.None ,否則會出現例外
那上面亂七八糟的說明,我想沒幾個人看得懂,所以我準備了 VS 的小絕招... 在 wcf 專案中的 web.config 上按右鍵,選擇「編輯 WCF 組態」
在這張圖片,就能看到各種選項,你完全能用按右鍵的方式新增,我想這樣不用想 web.config 要怎寫,欄位啥意思了XD
Reference:
http://msdn.microsoft.com/zh-tw/library/ms731082%28VS.90%29.aspx
http://social.msdn.microsoft.com/Forums/zh-TW/802/thread/a62d7b2c-59f4-4392-9ba6-c85a08e5c33c/
http://john-publish.blogspot.tw/2010/05/web-service-wcf-service.html
留言列表