WCF 第八章 安全 客户端认证
一個服務(wù)的客戶端認證是通過向服務(wù)提供一系列信賴的聲明。聲明可以是任何形式,只要客戶端和服務(wù)端理解這個格式并信賴它的來源就可以。
? 如果客戶端和服務(wù)端共享一個秘密信息,比如一個用戶名和密碼,只要客戶端通過一個合法認證發(fā)送數(shù)據(jù),服務(wù)端就相信客戶端所說的。這是HTTP基本認證架構(gòu)。在一個客戶端機器和服務(wù)器運行在活動目錄或者域中定義的賬戶的Windows-Only環(huán)境中,客戶端和服務(wù)端已經(jīng)是一種信賴關(guān)系。在這種情況下,可以使用Windows 認證,而Kerbeors或者NTLM令牌將會使用。如果客戶端和服務(wù)端都信賴一些第三方組織而且不是一個Windows域的一部分時,基于證書的認證時最適合的,這樣客戶端可以從源獲取一個服務(wù)端信任的證書并發(fā)送給服務(wù)端。
? 當安全模式設(shè)置為Transport時,一個服務(wù)端在transport元素的clientCredentialType屬性中確定客戶端認證要求。這是通過在服務(wù)端的服務(wù)描述中的綁定配置中完成的,可以在配置文件中或者代碼中定義。不同的綁定有不同的客戶端認證元數(shù)據(jù)。表8.1簡要列出了內(nèi)建綁定的選項。
表8.1 傳輸安全的客戶端認證
? 當使用基于傳輸安全的客戶端認證時,客戶端必須在發(fā)送消息前向信道附加聲明。客戶端必須附加符合服務(wù)要求的聲明。例如,如果基本認證需要一個基于HTTP的綁定,客戶端必須發(fā)送一個用戶名和密碼。如果有任何綁定需要證書認證,客戶端必須使用它的私鑰對消息簽名并從一個由服務(wù)端信賴的權(quán)威組織發(fā)送一個數(shù)字證書(如果服務(wù)端還沒有數(shù)字證書)。
使用基本認證和basicHttpBinding的認證過程
列表8.4, “使用basicHttpBinding加密”,描述了一個使用basicHttpBinding傳輸安全模式來通過SSL實現(xiàn)加密的服務(wù)配置文件。為了向這個例子中添加用戶名/密碼,需要將clientCredentialType屬性改為Basic.列表8.6顯示了一個實現(xiàn)的一個要求在傳輸層認證的改變的配置文件的片段。這個服務(wù)將很適合互聯(lián)網(wǎng)通信因為認證通過一個安全傳輸層傳輸。
列表8.6 使用basicHttpBinding的基本認證
<basicHttpBinding><binding name="MyBinding"><security mode="Transport"><transport clientCredentialType="Basic"><extendedProtectionPolicy policyEnforcement="Never" /></transport></security></binding></basicHttpBinding>? 當使用基本認證時,客戶端必須向服務(wù)端傳遞一個用戶名和密碼。這個使用一個代理類或者直接在信道上完成的。列表8.7顯示了終結(jié)點使用basicHttpBinding和基本認證向服務(wù)端傳輸證書的客戶端代碼。
列表8.7 從一個客戶端傳遞用戶名和密碼
proxy.ClientCredentials.UserName.UserName = "MyDomain\\Me";
proxy.ClientCredentials.UserName.Password = "SecretPassword";
? 當安全風險不是很大時且在一個客戶端和一個服務(wù)端共享一條私有消息是可行的時候使用基本認證模式或者用戶名/密碼認證模式是合適的。因為密碼很容易存儲在人們桌面上的即時日志中,數(shù)據(jù)庫表里或者配置文件中,所以它們很容易被拷貝或者不被注意的情況下被查看。為了保持它們”新鮮”,它們頻繁的無效(“你的密碼將會在10天內(nèi)過期”)所以有額外的開銷涉及進來。額外的,因為人們常常在多個賬戶中重用同一個密碼,一個賬戶的危機可能導致其他系統(tǒng)危機。
使用Windows 證書認證
其他的認證方案比用戶名/密碼方式更加更全。如果你在一個有活動目錄的Window 環(huán)境中工作,可以使用Windows認證。這需要客戶端的用戶/進程的身份信息并向服務(wù)端發(fā)送這些證明信息。這是一個單點登錄解決方案,在這個方案中檔用戶登錄到Windows域中后,用戶的證書可以可以自動的從客戶端機器傳輸?shù)椒?wù)端。當使用Windows認證時,列表8.7顯示的客戶端代碼就不需要了。列表8.8顯示了使用Windows認證的net.tcp綁定。
列表8.8 使用basicHttpBinding的Windows認證
<basicHttpBinding><binding name="MyBinding"><security mode="Transport"><transport clientCredentialType="Windows"><extendedProtectionPolicy policyEnforcement="Never" /></transport></security></binding></basicHttpBinding>使用證書和netTcpBinding認證
數(shù)字證書相比密碼可以提供一個更加廣泛形式的驗證。對要求安全的場景來說,快,基于證書的通信,netTcpBinding是一個好的選擇。可以在復雜局域網(wǎng)中找到證書與混合安全模式一起工作,包括Windows, UNIX和第三方的LDAP 認證。在互聯(lián)網(wǎng)上,如果你需要快速的,安全的服務(wù)到服務(wù)的通信,而且你可以確定哪個防火墻端口打開了,netTcpBinding可以證明是非常有價值的。使用基于證書的NetTcpBinding連接了快速通信和魯棒性安全。
? 列表8.9 顯示了一個使用傳輸層安全的服務(wù)配置和一個基于證書的客戶端認證。有很多點是沒有價值的。首先,服務(wù)通過在NetTcpBinding綁定中使用clientCredentialType來配置為需要客戶端證書。其次,服務(wù)的證書在<serviceCredential>節(jié)點中確定。這是必要的以便于服務(wù)端知道在SSL握手中使用哪個證書和密鑰。第三,服務(wù)端通過確定PeerTrust為certificationValidationMode配置去忽略驗證客戶端證書的路徑。當與通過MakeCert.exe生成的證書一起工作時這是必須的,而不是獲取的真實證書或者從一個可信賴組織生成的。
列表8.9 使用NetTcpBinding的證書認證
<?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ù)端之間初始化通信,客戶端必須確定一個用來認證的證書。這可以在配置文件中或者代碼中完成。列表8.10顯示了為在認證中使用的服務(wù)附加一個證書到信道的客戶端代碼。在對等信賴下,服務(wù)將在它的可信賴人文件夾中尋找證書。如果找到了,訪問將會被允許;如果找不到,訪問將會被拒絕。
列表8.10 證書認證的客戶端代碼
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
- 下一篇: ubuntu 如何转换 ppk ,连接