Basic驗證方式是基於使用者名稱/密碼的驗證方式,在Windows環境下,我們提供的是有效的Windows使用者名稱和密碼。但是Basic身份驗證方式和Windows身份驗證方式是有本質上的區別的。Basic是Http安全規範(RFC 2617),不同的網際網路應用體系都可以實現和進行Basic身份驗證。
我們使用程式碼清單11-89的配置在TransportCredentialOnly模式下啟用Basic驗證。
程式碼清單11-89 啟用Basic驗證
<basicHttpBinding>
<binding
name="basicBindingConf">
<security
mode="TransportCredentialOnly">
<transport
clientCredentialType="Basic">
</transport>
</security>
</binding>
</basicHttpBinding>
配置檔案修改完畢之後,我們還需要配置IIS來支援Basic驗證,這裡我關閉其他所有驗證方式,只開啟基本驗證,如圖11-39。
圖11-39 啟用IIS基本身份驗證
服務端配置完畢,在測試站點上更新服務,會看到更新後的配置檔案,如程式碼清單11-90所示。
程式碼清單11-90 客戶端配置Basic驗證
<security mode="TransportCredentialOnly">
<transport
clientCredentialType="Basic" proxyCredentialType="None" realm=""/>
<message
clientCredentialType="UserName" algorithmSuite="Default"/>
</security>
上面配置中“realm”屬性配置的是域資訊。實際代表的是每次請求的根URL。
那麼如何在在客戶端傳遞驗證資訊呢?看程式碼清單11-91。
程式碼清單11-91 傳遞客戶端Basic驗證資訊
1:
2: public ActionResultIndex()
3: {
4: client.ClientCredentials.UserName.UserName="administrator";
5: client.ClientCredentials.UserName.Password="xuan$%^hun456";
6: stringhelloString=client.GetHello();
7: ViewData["Message"]=helloString;
8: returnView();
9: }
從清單11-90中,我們可以看到,與Windows驗證不同的是,使用了另一個物件來傳遞身份資訊,client.ClientCredentials.UserName對。client.ClientCredentials.UserName的UserName屬性和Password屬性分別用來傳遞使用者名稱和密碼。
執行測試站點,結果如圖11-40。
圖11-40 Basic驗證結果
我們再來分析下Basic驗證方式是如何通過Http傳輸的,請求資訊如程式碼清單11-92,應答資訊如程式碼清單11-93。
程式碼清單11-92 Basic請求資訊
POST http://wcfservicewebsite.com/HelloService.svc HTTP/1.1
Content-Type: text/xml; charset=utf-8
VsDebuggerCausalityData:
uIDPo9qmOexINPFJi+3tKDrHjuIAAAAA9X2d7hDLH0GIwSTCqNRNiRHsOF3Z8KRDvBWVY4qgV1EACQAA
SOAPAction: "http://tempuri.org/IHelloService/GetHello"
Authorization: Basic YWRtaW5pc3RyYXRvcjp4dWFuJCVeaHVuNDU2
Host: wcfservicewebsite.com
Content-Length: 133
Expect: 100-continue
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
<s:Envelope
xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><GetHello
xmlns="http://tempuri.org/"/></s:Body></s:Envelope>
程式碼清單11-93 Basic應答資訊
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Vary: Accept-Encoding
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Sun, 26 Jun 2011 05:01:41 GMT
Content-Length: 237
<s:Envelope
xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><GetHelloResponse
xmlns="http://tempuri.org/"><GetHelloResult>Hello:BS--YANGWENHAI\Administrator;type=Basic</GetHelloResult></GetHelloResponse></s:Body></s:Envelope>
我們先看請求資訊,重點關注這一句:
Authorization: Basic YWRtaW5pc3RyYXRvcjp4dWFuJCVeaHVuNDU2。
這句話由三段組成,第一段Authorization:標誌驗證資訊;第二段Basic:標誌驗證型別為Basic;第三段:YWRtaW5pc3RyYXRvcjp4dWFuJCVeaHVuNDU2,是一段Base64編碼的文字,內容是什麼呢?我們對其轉碼,結果如下:
administrator:xuan$%^hun456
可以看到這是由冒號(:)分割的使用者名稱和密碼。
我們在看響應資料,驗證通過之後直接返回結果,那麼如果驗證不通過呢?我們修改客戶端提供的密碼資訊,再次提交請求,看結果如何。
除錯捕獲的異常資訊如圖11-41所示。
圖11-41 Basic驗證失敗
圖11-41通知客戶端驗證失敗,同時我們還可以看到當我們不在配置檔案和IIS中配置域資訊時,IIS會自動將請求的域資訊填充的頭部。現在我們再看捕獲的Http資訊。響應資訊如程式碼清單11-94。
程式碼清單11-94 Basic驗證失敗響應資訊
HTTP/1.1 401 Unauthorized
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/7.5
WWW-Authenticate: Basic realm="wcfservicewebsite.com"
X-Powered-By: ASP.NET
Date: Sun, 26 Jun 2011 05:27:25 GMT
Content-Length: 6329
返回的資訊,第一行錯誤碼為“401”,解釋為“Unauthorized”。加粗的一行標識了具體驗證失敗的資訊,WWW-Authenticate是標準的驗證響應頭欄位,Basic表明驗證方式為“Basic”,realm表明未通過驗證的域為“wcfservicewebsite.com”。