Udostępnij przez


Zabezpieczenia komunikatów z klientem systemu Windows

W tym scenariuszu przedstawiono klienta i serwer programu Windows Communication Foundation (WCF) zabezpieczonego przez tryb zabezpieczeń komunikatów. Klient i usługa są uwierzytelniane przy użyciu poświadczeń systemu Windows.

Zabezpieczenia komunikatów z klientem systemu Windows

Charakterystyka Opis
Tryb zabezpieczeń Komunikat
Współdziałanie Wyłącznie WCF
Uwierzytelnianie (serwer) Wzajemne uwierzytelnianie serwera i klienta
Uwierzytelnianie (klient) Wzajemne uwierzytelnianie serwera i klienta
Integralność Tak, przy użyciu udostępnionego kontekstu zabezpieczeń
Poufność Tak, przy użyciu udostępnionego kontekstu zabezpieczeń
Transport SIEĆ TCP
Wiążący NetTcpBinding

Usługa

Poniższy kod i konfiguracja mają być uruchamiane niezależnie. Wykonaj jedną z następujących czynności:

  • Utwórz autonomiczną usługę przy użyciu kodu bez konfiguracji.

  • Utwórz usługę przy użyciu podanej konfiguracji, ale nie zdefiniuj żadnych punktów końcowych.

Kod

Poniższy kod pokazuje, jak utworzyć punkt końcowy usługi, który używa zabezpieczeń komunikatów do ustanowienia bezpiecznego kontekstu z maszyną z systemem Windows.

// Create the binding.
NetTcpBinding binding = new NetTcpBinding();
binding.Security.Mode = SecurityMode.Message;
binding.Security.Message.ClientCredentialType =
    MessageCredentialType.Windows;

// Create the URI for the endpoint.
Uri netTcpUri = new Uri("net.tcp://localhost:8008/Calculator");

// Crate the service host and add an endpoint.
ServiceHost myServiceHost = new ServiceHost
    (typeof(Calculator), netTcpUri);
myServiceHost.AddServiceEndpoint(
    typeof(ICalculator), binding, "");

// Open the service.
myServiceHost.Open();
Console.WriteLine("Listening ....");
Console.ReadLine();

// Close the service.
myServiceHost.Close();
' Create the binding.
Dim binding As New NetTcpBinding()
binding.Security.Mode = SecurityMode.Message
binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows

' Create the URI for the endpoint.
Dim netTcpUri As New Uri("net.tcp://localhost:8008/Calculator")

' Crate the service host and add an endpoint.
Dim myServiceHost As New ServiceHost(GetType(ServiceModel.Calculator), netTcpUri)
myServiceHost.AddServiceEndpoint(GetType(ICalculator), binding, "")

' Open the service.
myServiceHost.Open()
Console.WriteLine("Listening ....")
Console.ReadLine()

' Close the service.
myServiceHost.Close()

Konfiguracja

Poniższa konfiguracja może służyć zamiast kodu do konfigurowania usługi:

<?xml version="1.0" encoding="utf-8"?>  
<configuration>  
  <system.serviceModel>  
    <services>  
      <service behaviorConfiguration=""  
               name="ServiceModel.Calculator">  
        <endpoint address="net.tcp://localhost:8008/Calculator"  
                  binding="netTcpBinding"  
                  bindingConfiguration="Windows"  
                  name="WindowsOverMessage"  
                  contract="ServiceModel.ICalculator" />  
      </service>  
    </services>  
    <bindings>  
      <netTcpBinding>  
        <binding name="Windows">  
          <security mode="Message">  
            <message clientCredentialType="Windows" />  
          </security>  
        </binding>  
      </netTcpBinding>  
    </bindings>  
    <client />  
  </system.serviceModel>  
</configuration>  

Klient

Poniższy kod i konfiguracja mają być uruchamiane niezależnie. Wykonaj jedną z następujących czynności:

  • Utwórz klienta autonomicznego przy użyciu kodu (i kodu klienta).

  • Utwórz klienta, który nie definiuje żadnych adresów punktów końcowych. Zamiast tego użyj konstruktora klienta, który przyjmuje nazwę konfiguracji jako argument. Przykład:

    CalculatorClient cc = new CalculatorClient("EndpointConfigurationName");
    
    Dim cc As New CalculatorClient("EndpointConfigurationName")
    

Kod

Poniższy kod tworzy klienta. Wiązanie dotyczy zabezpieczenia w trybie wiadomości, a typ poświadczeń klienta jest ustawiony na Windows.

// Create the binding.
NetTcpBinding myBinding = new NetTcpBinding();
myBinding.Security.Mode = SecurityMode.Message;
myBinding.Security.Message.ClientCredentialType =
    MessageCredentialType.Windows;

// Create the endpoint address.
EndpointAddress ea = new
    EndpointAddress("net.tcp://machineName:8008/Calculator");

// Create the client.
CalculatorClient cc =
    new CalculatorClient(myBinding, ea);

// Begin using the client.
try
{
    cc.Open();
    Console.WriteLine(cc.Add(200, 1111));
    Console.ReadLine();

    // Close the client.
    cc.Close();
}
' Create the binding.
Dim myBinding As New NetTcpBinding()
myBinding.Security.Mode = SecurityMode.Message
myBinding.Security.Message.ClientCredentialType = MessageCredentialType.Windows

' Create the endpoint address.
Dim ea As New EndpointAddress("net.tcp://machineName:8008/Calculator")

' Create the client.
Dim cc As New CalculatorClient(myBinding, ea)

' Begin using the client.
Try
    cc.Open()

    Console.WriteLine(cc.Add(100, 11))
    Console.ReadLine()

    ' Close the client.
    cc.Close()
Catch tex As TimeoutException
    Console.WriteLine(tex.Message)
    cc.Abort()
Catch cex As CommunicationException
    Console.WriteLine(cex.Message)
    cc.Abort()
Finally
    Console.WriteLine("Closed the client")
    Console.ReadLine()
End Try

Konfiguracja

Poniższa konfiguracja służy do ustawiania właściwości klienta.

<?xml version="1.0" encoding="utf-8"?>  
<configuration>  
  <system.serviceModel>  
    <bindings>  
      <netTcpBinding>  
        <binding name="NetTcpBinding_ICalculator" >  
         <security mode="Message">  
            <message clientCredentialType="Windows" />  
          </security>  
        </binding>  
      </netTcpBinding>  
    </bindings>  
    <client>  
      <endpoint address="net.tcp://machineName:8008/Calculator"
                binding="netTcpBinding"  
                bindingConfiguration="NetTcpBinding_ICalculator"  
                contract="ICalculator"  
                name="NetTcpBinding_ICalculator">
      </endpoint>  
    </client>  
  </system.serviceModel>  
</configuration>  

Zobacz także