WCF 第八章 安全 客户端认证
一個(gè)服務(wù)的客戶端認(rèn)證是通過向服務(wù)提供一系列信賴的聲明。聲明可以是任何形式,只要客戶端和服務(wù)端理解這個(gè)格式并信賴它的來源就可以。
? 如果客戶端和服務(wù)端共享一個(gè)秘密信息,比如一個(gè)用戶名和密碼,只要客戶端通過一個(gè)合法認(rèn)證發(fā)送數(shù)據(jù),服務(wù)端就相信客戶端所說的。這是HTTP基本認(rèn)證架構(gòu)。在一個(gè)客戶端機(jī)器和服務(wù)器運(yùn)行在活動(dòng)目錄或者域中定義的賬戶的Windows-Only環(huán)境中,客戶端和服務(wù)端已經(jīng)是一種信賴關(guān)系。在這種情況下,可以使用Windows 認(rèn)證,而Kerbeors或者NTLM令牌將會(huì)使用。如果客戶端和服務(wù)端都信賴一些第三方組織而且不是一個(gè)Windows域的一部分時(shí),基于證書的認(rèn)證時(shí)最適合的,這樣客戶端可以從源獲取一個(gè)服務(wù)端信任的證書并發(fā)送給服務(wù)端。
? 當(dāng)安全模式設(shè)置為Transport時(shí),一個(gè)服務(wù)端在transport元素的clientCredentialType屬性中確定客戶端認(rèn)證要求。這是通過在服務(wù)端的服務(wù)描述中的綁定配置中完成的,可以在配置文件中或者代碼中定義。不同的綁定有不同的客戶端認(rèn)證元數(shù)據(jù)。表8.1簡要列出了內(nèi)建綁定的選項(xiàng)。
表8.1 傳輸安全的客戶端認(rèn)證
? 當(dāng)使用基于傳輸安全的客戶端認(rèn)證時(shí),客戶端必須在發(fā)送消息前向信道附加聲明。客戶端必須附加符合服務(wù)要求的聲明。例如,如果基本認(rèn)證需要一個(gè)基于HTTP的綁定,客戶端必須發(fā)送一個(gè)用戶名和密碼。如果有任何綁定需要證書認(rèn)證,客戶端必須使用它的私鑰對(duì)消息簽名并從一個(gè)由服務(wù)端信賴的權(quán)威組織發(fā)送一個(gè)數(shù)字證書(如果服務(wù)端還沒有數(shù)字證書)。
使用基本認(rèn)證和basicHttpBinding的認(rèn)證過程
列表8.4, “使用basicHttpBinding加密”,描述了一個(gè)使用basicHttpBinding傳輸安全模式來通過SSL實(shí)現(xiàn)加密的服務(wù)配置文件。為了向這個(gè)例子中添加用戶名/密碼,需要將clientCredentialType屬性改為Basic.列表8.6顯示了一個(gè)實(shí)現(xiàn)的一個(gè)要求在傳輸層認(rèn)證的改變的配置文件的片段。這個(gè)服務(wù)將很適合互聯(lián)網(wǎng)通信因?yàn)檎J(rèn)證通過一個(gè)安全傳輸層傳輸。
列表8.6 使用basicHttpBinding的基本認(rèn)證
<basicHttpBinding><binding name="MyBinding"><security mode="Transport"><transport clientCredentialType="Basic"><extendedProtectionPolicy policyEnforcement="Never" /></transport></security></binding></basicHttpBinding>? 當(dāng)使用基本認(rèn)證時(shí),客戶端必須向服務(wù)端傳遞一個(gè)用戶名和密碼。這個(gè)使用一個(gè)代理類或者直接在信道上完成的。列表8.7顯示了終結(jié)點(diǎn)使用basicHttpBinding和基本認(rèn)證向服務(wù)端傳輸證書的客戶端代碼。
列表8.7 從一個(gè)客戶端傳遞用戶名和密碼
proxy.ClientCredentials.UserName.UserName = "MyDomain\\Me";
proxy.ClientCredentials.UserName.Password = "SecretPassword";
? 當(dāng)安全風(fēng)險(xiǎn)不是很大時(shí)且在一個(gè)客戶端和一個(gè)服務(wù)端共享一條私有消息是可行的時(shí)候使用基本認(rèn)證模式或者用戶名/密碼認(rèn)證模式是合適的。因?yàn)槊艽a很容易存儲(chǔ)在人們桌面上的即時(shí)日志中,數(shù)據(jù)庫表里或者配置文件中,所以它們很容易被拷貝或者不被注意的情況下被查看。為了保持它們”新鮮”,它們頻繁的無效(“你的密碼將會(huì)在10天內(nèi)過期”)所以有額外的開銷涉及進(jìn)來。額外的,因?yàn)槿藗兂3T诙鄠€(gè)賬戶中重用同一個(gè)密碼,一個(gè)賬戶的危機(jī)可能導(dǎo)致其他系統(tǒng)危機(jī)。
使用Windows 證書認(rèn)證
其他的認(rèn)證方案比用戶名/密碼方式更加更全。如果你在一個(gè)有活動(dòng)目錄的Window 環(huán)境中工作,可以使用Windows認(rèn)證。這需要客戶端的用戶/進(jìn)程的身份信息并向服務(wù)端發(fā)送這些證明信息。這是一個(gè)單點(diǎn)登錄解決方案,在這個(gè)方案中檔用戶登錄到Windows域中后,用戶的證書可以可以自動(dòng)的從客戶端機(jī)器傳輸?shù)椒?wù)端。當(dāng)使用Windows認(rèn)證時(shí),列表8.7顯示的客戶端代碼就不需要了。列表8.8顯示了使用Windows認(rèn)證的net.tcp綁定。
列表8.8 使用basicHttpBinding的Windows認(rèn)證
<basicHttpBinding><binding name="MyBinding"><security mode="Transport"><transport clientCredentialType="Windows"><extendedProtectionPolicy policyEnforcement="Never" /></transport></security></binding></basicHttpBinding>使用證書和netTcpBinding認(rèn)證
數(shù)字證書相比密碼可以提供一個(gè)更加廣泛形式的驗(yàn)證。對(duì)要求安全的場(chǎng)景來說,快,基于證書的通信,netTcpBinding是一個(gè)好的選擇。可以在復(fù)雜局域網(wǎng)中找到證書與混合安全模式一起工作,包括Windows, UNIX和第三方的LDAP 認(rèn)證。在互聯(lián)網(wǎng)上,如果你需要快速的,安全的服務(wù)到服務(wù)的通信,而且你可以確定哪個(gè)防火墻端口打開了,netTcpBinding可以證明是非常有價(jià)值的。使用基于證書的NetTcpBinding連接了快速通信和魯棒性安全。
? 列表8.9 顯示了一個(gè)使用傳輸層安全的服務(wù)配置和一個(gè)基于證書的客戶端認(rèn)證。有很多點(diǎn)是沒有價(jià)值的。首先,服務(wù)通過在NetTcpBinding綁定中使用clientCredentialType來配置為需要客戶端證書。其次,服務(wù)的證書在<serviceCredential>節(jié)點(diǎn)中確定。這是必要的以便于服務(wù)端知道在SSL握手中使用哪個(gè)證書和密鑰。第三,服務(wù)端通過確定PeerTrust為certificationValidationMode配置去忽略驗(yàn)證客戶端證書的路徑。當(dāng)與通過MakeCert.exe生成的證書一起工作時(shí)這是必須的,而不是獲取的真實(shí)證書或者從一個(gè)可信賴組織生成的。
列表8.9 使用NetTcpBinding的證書認(rèn)證
<?xml version="1.0" encoding="utf-8" ?> <configuration><system.serviceModel><bindings><netTcpBinding><binding name="MyBinding"><security><transport clientCredentialType="Certificate"><extendedProtectionPolicy policyEnforcement="Never" /></transport><message clientCredentialType="None" /></security></binding></netTcpBinding></bindings><behaviors><serviceBehaviors><behavior name="metadata"><serviceMetadata httpGetEnabled="true" /></behavior><behavior name="NewBehavior"><serviceCredentials><clientCertificate><authentication certificateValidationMode="PeerTrust" /></clientCertificate><serviceCertificate findValue="localhost" x509FindType="FindBySubjectName" /></serviceCredentials></behavior></serviceBehaviors></behaviors><services><service behaviorConfiguration="metadata" name="EssentialWCF.EmployeeInformation"><endpoint address="" binding="netTcpBinding" bindingConfiguration="MyBinding"contract="EssentialWCF.IEmployeeInformation" /><endpoint address="mex" binding="mexHttpBinding" bindingConfiguration=""contract="IMetadataExchange" /><host><baseAddresses><add baseAddress="http://localhost:8000/EffectiveWCF" /><add baseAddress="net.tcp://localhost:8001/EffectiveWCF" /></baseAddresses></host></service></services></system.serviceModel> </configuration>為了在客戶端和服務(wù)端之間初始化通信,客戶端必須確定一個(gè)用來認(rèn)證的證書。這可以在配置文件中或者代碼中完成。列表8.10顯示了為在認(rèn)證中使用的服務(wù)附加一個(gè)證書到信道的客戶端代碼。在對(duì)等信賴下,服務(wù)將在它的可信賴人文件夾中尋找證書。如果找到了,訪問將會(huì)被允許;如果找不到,訪問將會(huì)被拒絕。
列表8.10 證書認(rèn)證的客戶端代碼
Employee employee = new Employee(358, "Daniel", "Dong", "210");EmployeeInformationClient proxy = new EmployeeInformationClient();proxy.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.PeerTrust;proxy.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectName, "MyClientCert");try{Employee e = proxy.UpdateEmployee(employee);Console.WriteLine("Name is: {0}", e.FirstName);}catch (Exception ex){Console.WriteLine(ex.Message);}轉(zhuǎn)載于:https://www.cnblogs.com/danielWise/archive/2011/01/11/1933206.html
總結(jié)
以上是生活随笔為你收集整理的WCF 第八章 安全 客户端认证的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转载】Android Animatio
- 下一篇: 链接库注意事项