自訂繫結安全性
這個範例會示範如何設定使用自訂繫結的安全性。它會顯示如何使用自訂繫結同時啟用訊息層級安全性和安全傳輸。當在用戶端和服務之間傳輸訊息需要安全傳輸,且同時必須保護訊息層級上訊息的安全時,這是相當有用的。系統提供的繫結不支援這個組態。
這個範例是由用戶端主控台程式 (EXE) 與服務主控台程式 (EXE) 所組成。服務會實作雙工合約。合約是由 ICalculatorDuplex
介面所定義,這個介面會公開數學運算作業 (加、減、乘、除)。ICalculatorDuplex
介面允許用戶端執行數學運算,計算整個工作階段的執行結果。服務可能會獨立地傳回 ICalculatorDuplexCallback
介面上的結果。雙工合約需要一個工作階段,因為必須建立內容,將用戶端與服務之間傳送的訊息關聯在一起。自訂繫結已定義成支援雙工通訊,而且具備安全性。
注意: |
---|
此範例的安裝程序與建置指示位於本主題的結尾。 |
服務組態會定義支援下列作業的自訂繫結:
- 使用 TLS/SSL 通訊協定保護的 TCP 通訊。
- Windows 訊息安全性。
自訂繫結組態會同時啟用訊息層級安全性以啟用安全傳輸。繫結項目的排序對於定義自訂繫結很重要,因為每一個項目都代表通道堆疊中的一層 (請參閱Custom Bindings)。自訂繫結會定義在服務與用戶端組態檔中,如下列範例組態所示。
<bindings>
<!-- Configure a custom binding. -->
<customBinding>
<binding name="Binding1">
<security authenticationMode="SecureConversation"
requireSecurityContextCancellation="true">
</security>
<textMessageEncoding messageVersion="Soap12WSAddressing10" writeEncoding="utf-8"/>
<sslStreamSecurity requireClientCertificate="false"/>
<tcpTransport/>
</binding>
</customBinding>
</bindings>
自訂繫結使用服務憑證來驗證傳輸層級上的服務,並在用戶端和服務之間進行傳輸時保護訊息。這是由 sslStreamSecurity
繫結項目所完成。服務的憑證會使用服務行為設定,如下列範例組態所示。
<behaviors>
<serviceBehaviors>
<behavior name="CalculatorServiceBehavior">
<serviceMetadata />
<serviceDebug includeExceptionDetailInFaults="False" />
<serviceCredentials>
<serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName"/>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
此外,自訂繫結使用 Windows 認證類型 (預設認證類型) 的訊息安全性。這是由 security
繫結項目所完成。如果可以使用 Kerberos 驗證機制,則會使用訊息層級安全性來驗證用戶端和服務。如果此範例是執行於 Active Directory 環境,就會發生這種情況。如果 Kerberos 驗證機制無法使用,則使用 NTLM 驗證。NTLM 會對服務驗證用戶端,但不會對用戶端驗證服務。security
繫結項目已設定為使用 SecureConversation
authenticationType
,結果會在用戶端和服務上建立安全性工作階段。若要讓服務的雙工合約能運作,這是必要的。
當您執行範例時,作業要求和回應會顯示在用戶端的主控台視窗中。在用戶端視窗中按下 ENTER 鍵,即可關閉用戶端。
Press <ENTER> to terminate client.
Result(100)
Result(50)
Result(882.5)
Result(441.25)
Equation(0 + 100 - 50 * 17.65 / 2 = 441.25)
當執行範例時,您會看到訊息在回呼服務所傳送的介面時傳回到用戶端。完成所有作業時,每個中繼結果都會顯示,並接著顯示整個方程式。按 ENTER 鍵關閉用戶端。
這個已包含的 Setup.bat 檔可讓您使用相關的服務憑證設定用戶端與伺服器,以執行需要憑證安全性的自我裝載應用程式。這個批次檔必須經過修改才能跨機器運作,或在非裝載的情況下運作。
下面提供套用至此範例之批次檔的各區段的簡要概觀,讓批次檔得以修改為在適當的組態下執行:
建立伺服器憑證。
下列 Setup.bat 檔中的程式行會建立要使用的伺服器憑證。%SERVER_NAME%
變數會指定伺服器名稱。您可以變更這個變數來指定自己的伺服器名稱。這個批次檔的名稱預設為伺服器名稱,localhost。
憑證會儲存在 Web 裝載服務的 CurrentUser 存放區中。echo ************ echo Server cert setup starting echo %SERVER_NAME% echo ************ echo making server cert echo ************ makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%SERVER_NAME% -sky exchange -pe
將伺服器憑證安裝至用戶端的受信任憑證存放區中。
Setup.bat 檔中的下列程式行會將伺服器憑證複製到用戶端受信任人的存放區。這是必要步驟,因為用戶端系統並未隱含信任 Makecert.exe 產生的憑證。如果您已經有一個以用戶端信任的根憑證 (例如 Microsoft 所發行的憑證) 為基礎的憑證,就不需要這個將伺服器憑證填入用戶端憑證的步驟。certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
注意: Setup.bat 批次檔是設計用來從 Windows SDK 命令提示字元執行。它要求 MSSDK 環境變數指向安裝 SDK 的目錄。這個環境變數是自動在 Windows SDK 命令提示字元中設定。
若要設定、建置及執行範例
若要建置方案的 C# 或 Visual Basic .NET 版本,請遵循建置 Windows Communication Foundation 範例中的指示。
若要在單一或跨機器的組態中執行本範例,請遵循執行 Windows Communication Foundation 範例中的指示。
若要在同一部機器上執行範例
確定路徑中包含 Makecert.exe 所在的資料夾。
從範例安裝資料夾執行 Setup.bat。這會安裝執行範例所需的所有憑證。
注意: Setup.bat 批次檔是設計用來從 Windows SDK 命令提示字元執行。它要求 MSSDK 環境變數指向安裝 SDK 的目錄。這個環境變數是自動在 Windows SDK 命令提示字元中設定。 從 \service\bin 啟動 Service.exe。
從 \client\bin 啟動 Client.exe。用戶端活動會顯示在用戶端主控台應用程式上。
如果用戶端和服務無法通訊,請參閱疑難排解秘訣。
若要跨機器執行範例
在服務機器上:
在服務機器上,建立名為 servicemodelsamples 的虛擬目錄。
將 \inetpub\wwwroot\servicemodelsamples 中的服務程式檔複製至服務機器上的虛擬目錄中。確定複製 \bin 子目錄中的檔案。
將 Setup.bat 和 Cleanup.bat 檔案複製到服務機器中。
執行下列命令:Setup.bat service。這會建立服務憑證,其主體名稱與批次檔執行於其中之機器的名稱相符。
注意: Setup.bat 批次檔是設計用來從 Windows SDK 命令提示字元執行。它要求 MSSDK 環境變數指向安裝 SDK 的目錄。這個環境變數是自動在 Windows SDK 命令提示字元中設定。 變更 Service.exe.config 檔中的 serviceCertificate element of serviceCredentials,以反映在上一個步驟中所產生的憑證主體名稱。
從命令提示字元執行 Service.exe。
在用戶端機器上:
將用戶端程式檔案從 \client\bin\ 資料夾複製到用戶端機器中。同時複製 Cleanup.bat 檔。
執行 Cleanup.bat,移除先前範例的任何舊憑證。
匯出服務的憑證,方法是在服務機器上執行下列命令 (將
%SERVER_NAME%
取代成其中有執行此服務之機器的完整名稱):certmgr -put -r LocalMachine -s My -c -n %SERVER_NAME% %SERVER_NAME%.cer
將 %SERVER_NAME%.cer 複製到用戶端機器 (將 %SERVER_NAME% 取代成其中有執行此服務之機器的完整名稱)。
匯入服務的憑證,方法是在用戶端機器上執行下列命令 (將 %SERVER_NAME% 取代成其中有執行此服務之機器的完整名稱):
certmgr.exe -add -c %SERVER_NAME%.cer -s -r CurrentUser TrustedPeople
如果憑證是由信任的發行者發行,就不需要執行步驟 c、d 和 e。
修改用戶端的 App.config,如下所示:
<client> <endpoint name="default" address="net.tcp://ReplaceThisWithServiceMachineName:8000/ServiceModelSamples/Service" binding="customBinding" bindingConfiguration="Binding1" contract="Microsoft.ServiceModel.Samples.ICalculatorDuplex" behaviorConfiguration="CalculatorClientBehavior" /> </client>
如果用於執行服務的帳戶有別於網域環境中的 NetworkService 或 LocalSystem 帳戶,您可能需要修改用戶端 App.config 檔中服務端點的端點身分識別,以根據用來執行服務之帳戶設定適當的 UPN 或 SPN。如需端點身分識別的詳細資訊,請參閱Specifying Service Identity主題。
從命令提示字元執行 Client.exe。
若要在使用範例之後進行清除
- 當您完成執行範例後,請執行範例資料夾中的 Cleanup.bat。
Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.