共用方式為


自訂繫結安全性

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

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

注意

此範例的安裝程序與建置指示位於本主題的結尾。

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

  • 使用 TLS/SSL 通訊協定保護的 TCP 通訊。

  • Windows 訊息安全性。

自訂繫結組態會同時啟用訊息層級安全性以啟用安全傳輸。 繫結項目的排序對於定義自訂繫結很重要,因為每一個項目都代表通道堆疊中的一層 (請參閱自訂繫結)。 自訂繫結會定義在服務與用戶端組態檔中,如下列範例組態所示。

<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 繫結項目已設定為使用 SecureConversationauthenticationType,結果會在用戶端和服務上建立安全性工作階段。 若要讓服務的雙工合約能運作,這是必要的。

當您執行範例時,作業要求和回應會顯示在用戶端的主控台視窗中。 在用戶端視窗中按下 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 批次檔是設計用來從 Visual Studio 2010 命令提示字元執行。 它要求 MSSDK 環境變數指向安裝 SDK 的目錄。 這個環境變數是自動在 Visual Studio 2010 命令提示字元中設定。

若要安裝、建置及執行範例

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

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

  3. 若要在單一或多部電腦組態中執行此範例,請遵循執行 Windows Communication Foundation 範例中的指示進行。

若要在同一部電腦上執行範例

  1. 使用系統管理員權限來開啟適用於 Visual Studio 的開發人員命令提示字元,然後執行範例安裝資料夾中的 Setup.bat。 這會安裝執行範例所需的所有憑證。

    注意

    Setup.bat 批次檔案是設計用來從 Visual Studio 命令提示字元執行。 在 Visual Studio 命令提示字元中設定的 PATH 環境變數,會指向包含 Setup.bat 指令碼所需可執行檔的目錄。

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

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

  4. 如果用戶端和服務無法通訊,請參閱 WCF 範例的疑難排解提示

若要跨電腦執行範例

  1. 在服務電腦上:

    1. 在服務電腦上建立名為 servicemodelsamples 的虛擬目錄。

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

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

    4. 在使用系統管理員權限開啟的適用於 Visual Studio 的開發人員命令提示字元中,執行下列命令:Setup.bat service。 這會建立服務憑證,其主體名稱與批次檔執行於其中之電腦的名稱相符。

      注意

      Setup.bat 批次檔是設計用來從 Visual Studio 2010 命令提示字元執行。 它要求 path 環境變數指向安裝 SDK 的目錄。 這個環境變數是自動在 Visual Studio 2010 命令提示字元中設定。

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

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

  2. 在用戶端電腦上:

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

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

    3. 匯出服務的憑證,方法是使用系統管理權限來開啟適用於 Visual Studio 的開發人員命令提示字元,然後在服務電腦上執行下列命令 (將 %SERVER_NAME% 取代成執行此服務之電腦的完整名稱):

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

    5. 匯入服務的憑證,方法是使用系統管理權限來開啟適用於 Visual Studio 的開發人員命令提示字元,然後在用戶端電腦上執行下列命令 (將 %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。 如需端點識別的詳細資訊,請參閱服務識別與驗證主題。

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

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

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