共用方式為


作法:使用 X.509 憑證來確保服務安全

使用 X.509 憑證確保服務安全,是 Windows Communication Foundation (WCF) 中大部分繫結使用的基本技術。 此主題會介紹使用 X.509 憑證設定自我主控服務的步驟。

必要條件是能夠用來驗證伺服器的有效憑證。 憑證必須透過受信任的憑證授權單位發行至伺服器。 如果憑證無效,任何嘗試使用服務的用戶端都不會信任該服務,因此無法建立連線。 如需使用憑證的詳細資訊,請參閱使用憑證 (機器翻譯)

使用程式碼搭配憑證設定服務

  1. 建立服務合約以及實作的服務。 如需詳細資訊,請參閱設計與實作服務 (機器翻譯)

  2. 建立 WSHttpBinding 類別的執行個體,並將其安全性模式設定為 Message,如下列程式碼所示。

    // Create a binding and set the security mode to Message.
    WSHttpBinding b = new WSHttpBinding(SecurityMode.Message);
    
    ' Create a binding and set the security mode to Message.
    Dim b As New WSHttpBinding(SecurityMode.Message)
    
  3. 建立兩個 Type 變數,分別指派給合約類型以及已實作合約,如下列程式碼所示。

    Type contractType = typeof(ICalculator);
    Type implementedContract = typeof(Calculator);
    
    Dim contractType = GetType(ICalculator)
    Dim implementedContract = GetType(Calculator)
    
  4. 建立服務基底位址之 Uri 類別的執行個體。 因為 WSHttpBinding 會使用 HTTP 傳輸,所以統一資源識別項 (URI) 必須以該結構描述開頭,否則開啟服務時,Windows Communication Foundation (WCF) 會擲回例外狀況。

    Uri baseAddress = new Uri("http://localhost:8044/base");
    
    Dim baseAddress As New Uri("http://localhost:8044/base")
    
  5. 使用已實作之合約類型變數與 URI 建立 ServiceHost 類別的新執行個體。

    ServiceHost sh = new ServiceHost(implementedContract, baseAddress);
    
    Dim sh As New ServiceHost(implementedContract, baseAddress)
    
  6. 使用 ServiceEndpoint 方法將 AddServiceEndpoint 新增至服務。 將合約、繫結,以及端點位址傳遞給建構函式,如下列程式碼所示。

    sh.AddServiceEndpoint(contractType, b, "Calculator");
    
    sh.AddServiceEndpoint(contractType, b, "Calculator")
    
  7. 選擇性。 若要從服務擷取中繼資料,請建立新的 ServiceMetadataBehavior 物件並將 HttpGetEnabled 屬性設定為 true

    ServiceMetadataBehavior sm = new ServiceMetadataBehavior();
    sm.HttpGetEnabled = true;
    sh.Description.Behaviors.Add(sm);
    
    Dim sm As New ServiceMetadataBehavior()
    sm.HttpGetEnabled = True
    
    With sh
        .Description.Behaviors.Add(sm)
    
  8. 請使用 SetCertificate 類別的 X509CertificateRecipientServiceCredential 方法,將有效憑證新增至服務。 方法就可以使用其中一種方法尋找憑證。 這個範例會使用 FindBySubjectName 列舉。 列舉會指定所提供的值,是憑證所發行至該實體的名稱。

    sh.Credentials.ServiceCertificate.SetCertificate(
        StoreLocation.LocalMachine ,StoreName.My,
        X509FindType.FindBySubjectName ,"localhost");
    
    .Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, _
                                                   StoreName.My, _
                                                   X509FindType.FindBySubjectName, _
                                                   "localhost")
    
  9. 呼叫 Open 方法啟動服務接聽。 如果您建立主控台應用程式,請呼叫 ReadLine 方法讓服務保持在接聽狀態。

    sh.Open();
    Console.WriteLine("Listening");
    Console.ReadLine();
    
    .Open()
    Console.WriteLine("Listening")
    Console.ReadLine()
    

範例

下列程式碼範例會使用 SetCertificate 方法,使用 X.509 憑證設定服務。

// Create a binding and set the security mode to Message.
WSHttpBinding b = new WSHttpBinding(SecurityMode.Message);

Type contractType = typeof(ICalculator);
Type implementedContract = typeof(Calculator);

Uri baseAddress = new Uri("http://localhost:8044/base");

ServiceHost sh = new ServiceHost(implementedContract, baseAddress);

sh.AddServiceEndpoint(contractType, b, "Calculator");

ServiceMetadataBehavior sm = new ServiceMetadataBehavior();
sm.HttpGetEnabled = true;
sh.Description.Behaviors.Add(sm);

sh.Credentials.ServiceCertificate.SetCertificate(
    StoreLocation.LocalMachine ,StoreName.My,
    X509FindType.FindBySubjectName ,"localhost");

sh.Open();
Console.WriteLine("Listening");
Console.ReadLine();
sh.Close();
' Create a binding and set the security mode to Message.
Dim b As New WSHttpBinding(SecurityMode.Message)

Dim contractType = GetType(ICalculator)
Dim implementedContract = GetType(Calculator)

Dim baseAddress As New Uri("http://localhost:8044/base")

Dim sh As New ServiceHost(implementedContract, baseAddress)

sh.AddServiceEndpoint(contractType, b, "Calculator")

Dim sm As New ServiceMetadataBehavior()
sm.HttpGetEnabled = True

With sh
    .Description.Behaviors.Add(sm)

    .Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, _
                                                   StoreName.My, _
                                                   X509FindType.FindBySubjectName, _
                                                   "localhost")

    .Open()
    Console.WriteLine("Listening")
    Console.ReadLine()
    .Close()
End With

編譯程式碼

要編譯程式碼時,必須有下列命名空間:

另請參閱