Udostępnij za pośrednictwem


Instrukcje: Zabezpieczanie usługi za pomocą certyfikatu X.509

Zabezpieczanie usługi przy użyciu certyfikatu X.509 jest podstawową techniką, która jest używana przez większość powiązań w programie Windows Communication Foundation (WCF). W tym temacie opisano kroki konfigurowania samoobsługowej usługi przy użyciu certyfikatu X.509.

Wymaganie wstępne to prawidłowy certyfikat, który może służyć do uwierzytelniania serwera. Certyfikat musi zostać wystawiony na serwerze przez zaufany urząd certyfikacji. Jeśli certyfikat jest nieprawidłowy, każdy klient próbujący korzystać z usługi nie będzie ufać usłudze, a w związku z tym nie zostanie nawiązane żadne połączenie. Aby uzyskać więcej informacji na temat używania certyfikatów, zobacz Praca z certyfikatami.

Aby skonfigurować usługę przy użyciu certyfikatu przy użyciu kodu

  1. Utwórz kontrakt usługi i zaimplementowaną usługę. Aby uzyskać więcej informacji, zobacz Projektowanie i implementowanie usług.

  2. Utwórz wystąpienie WSHttpBinding klasy i ustaw jej tryb zabezpieczeń na Message, jak pokazano w poniższym kodzie.

    // 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. Utwórz dwie Type zmienne, po jednym dla typu kontraktu i zaimplementowany kontrakt, jak pokazano w poniższym kodzie.

    Type contractType = typeof(ICalculator);
    Type implementedContract = typeof(Calculator);
    
    Dim contractType = GetType(ICalculator)
    Dim implementedContract = GetType(Calculator)
    
  4. Utwórz wystąpienie Uri klasy dla podstawowego adresu usługi. WSHttpBinding Ponieważ używa transportu HTTP, identyfikator URI (Uniform Resource Identifier) musi zaczynać się od tego schematu lub Windows Communication Foundation (WCF) zgłosi wyjątek po otwarciu usługi.

    Uri baseAddress = new Uri("http://localhost:8044/base");
    
    Dim baseAddress As New Uri("http://localhost:8044/base")
    
  5. Utwórz nowe wystąpienie ServiceHost klasy z zaimplementowaną zmienną typu kontraktu i identyfikatorem URI.

    ServiceHost sh = new ServiceHost(implementedContract, baseAddress);
    
    Dim sh As New ServiceHost(implementedContract, baseAddress)
    
  6. Dodaj element ServiceEndpoint do usługi przy użyciu AddServiceEndpoint metody . Przekaż kontrakt, powiązanie i adres punktu końcowego do konstruktora, jak pokazano w poniższym kodzie.

    sh.AddServiceEndpoint(contractType, b, "Calculator");
    
    sh.AddServiceEndpoint(contractType, b, "Calculator")
    
  7. Opcjonalny. Aby pobrać metadane z usługi, utwórz nowy ServiceMetadataBehavior obiekt i ustaw HttpGetEnabled właściwość na 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 Użyj metody X509CertificateRecipientServiceCredential klasy , aby dodać prawidłowy certyfikat do usługi. Metoda może użyć jednej z kilku metod do znalezienia certyfikatu. W tym przykładzie użyto FindBySubjectName wyliczenia. Wyliczenie określa, że podana wartość to nazwa jednostki wystawionej przez certyfikat.

    sh.Credentials.ServiceCertificate.SetCertificate(
        StoreLocation.LocalMachine ,StoreName.My,
        X509FindType.FindBySubjectName ,"localhost");
    
    .Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, _
                                                   StoreName.My, _
                                                   X509FindType.FindBySubjectName, _
                                                   "localhost")
    
  9. Wywołaj metodę Open , aby uruchomić nasłuchiwanie usługi. Jeśli tworzysz aplikację konsolową, wywołaj ReadLine metodę , aby zachować usługę w stanie nasłuchiwania.

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

Przykład

W poniższym przykładzie użyto SetCertificate metody do skonfigurowania usługi przy użyciu certyfikatu 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

Kompilowanie kodu

Do skompilowania kodu wymagane są następujące przestrzenie nazw:

Zobacz też