共用方式為


自訂繫結安全性

這個範例會示範如何設定使用自訂繫結的安全性。它會顯示如何使用自訂繫結同時啟用訊息層級安全性和安全傳輸。當在用戶端和服務之間傳輸訊息需要安全傳輸,且同時必須保護訊息層級上訊息的安全時,這是相當有用的。系統提供的繫結不支援這個組態。

這個範例是由用戶端主控台程式 (EXE) 與服務主控台程式 (EXE) 所組成。服務會實作雙工合約。合約是由 ICalculatorDuplex 介面所定義,這個介面會公開數學運算作業 (加、減、乘、除)。ICalculatorDuplex 介面允許用戶端執行數學運算,計算整個工作階段的執行結果。服務可能會獨立地傳回 ICalculatorDuplexCallback 介面上的結果。雙工合約需要一個工作階段,因為必須建立內容,將用戶端與服務之間傳送的訊息關聯在一起。自訂繫結已定義成支援雙工通訊,而且具備安全性。

ms751528.note(zh-tw,VS.90).gif注意:
此範例的安裝程序與建置指示位於本主題的結尾。

服務組態會定義支援下列作業的自訂繫結:

  • 使用 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
    
    ms751528.note(zh-tw,VS.90).gif注意:
    Setup.bat 批次檔是設計用來從 Windows SDK 命令提示字元執行。它要求 MSSDK 環境變數指向安裝 SDK 的目錄。這個環境變數是自動在 Windows SDK 命令提示字元中設定。

若要設定、建置及執行範例

  1. 請確定您已執行 Windows Communication Foundation 範例的單次安裝程序

  2. 若要建置方案的 C# 或 Visual Basic .NET 版本,請遵循建置 Windows Communication Foundation 範例中的指示。

  3. 若要在單一或跨機器的組態中執行本範例,請遵循執行 Windows Communication Foundation 範例中的指示。

若要在同一部機器上執行範例

  1. 確定路徑中包含 Makecert.exe 所在的資料夾。

  2. 從範例安裝資料夾執行 Setup.bat。這會安裝執行範例所需的所有憑證。

    ms751528.note(zh-tw,VS.90).gif注意:
    Setup.bat 批次檔是設計用來從 Windows SDK 命令提示字元執行。它要求 MSSDK 環境變數指向安裝 SDK 的目錄。這個環境變數是自動在 Windows SDK 命令提示字元中設定。

  3. 從 \service\bin 啟動 Service.exe。

  4. 從 \client\bin 啟動 Client.exe。用戶端活動會顯示在用戶端主控台應用程式上。

  5. 如果用戶端和服務無法通訊,請參閱疑難排解秘訣

若要跨機器執行範例

  1. 在服務機器上:

    1. 在服務機器上,建立名為 servicemodelsamples 的虛擬目錄。

    2. 將 \inetpub\wwwroot\servicemodelsamples 中的服務程式檔複製至服務機器上的虛擬目錄中。確定複製 \bin 子目錄中的檔案。

    3. 將 Setup.bat 和 Cleanup.bat 檔案複製到服務機器中。

    4. 執行下列命令:Setup.bat service。這會建立服務憑證,其主體名稱與批次檔執行於其中之機器的名稱相符。

      ms751528.note(zh-tw,VS.90).gif注意:
      Setup.bat 批次檔是設計用來從 Windows SDK 命令提示字元執行。它要求 MSSDK 環境變數指向安裝 SDK 的目錄。這個環境變數是自動在 Windows SDK 命令提示字元中設定。

    5. 變更 Service.exe.config 檔中的 serviceCertificate element of serviceCredentials,以反映在上一個步驟中所產生的憑證主體名稱。

    6. 從命令提示字元執行 Service.exe。

  2. 在用戶端機器上:

    1. 將用戶端程式檔案從 \client\bin\ 資料夾複製到用戶端機器中。同時複製 Cleanup.bat 檔。

    2. 執行 Cleanup.bat,移除先前範例的任何舊憑證。

    3. 匯出服務的憑證,方法是在服務機器上執行下列命令 (將 %SERVER_NAME% 取代成其中有執行此服務之機器的完整名稱):

      certmgr -put -r LocalMachine -s My -c -n %SERVER_NAME% %SERVER_NAME%.cer
      
    4. 將 %SERVER_NAME%.cer 複製到用戶端機器 (將 %SERVER_NAME% 取代成其中有執行此服務之機器的完整名稱)。

    5. 匯入服務的憑證,方法是在用戶端機器上執行下列命令 (將 %SERVER_NAME% 取代成其中有執行此服務之機器的完整名稱):

      certmgr.exe -add -c %SERVER_NAME%.cer -s -r CurrentUser TrustedPeople
      

      如果憑證是由信任的發行者發行,就不需要執行步驟 c、d 和 e。

    6. 修改用戶端的 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>
      
    7. 如果用於執行服務的帳戶有別於網域環境中的 NetworkService 或 LocalSystem 帳戶,您可能需要修改用戶端 App.config 檔中服務端點的端點身分識別,以根據用來執行服務之帳戶設定適當的 UPN 或 SPN。如需端點身分識別的詳細資訊,請參閱Specifying Service Identity主題。

    8. 從命令提示字元執行 Client.exe。

若要在使用範例之後進行清除

  • 當您完成執行範例後,請執行範例資料夾中的 Cleanup.bat。

Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.