Aracılığıyla paylaş


Anonim İstemci ile İleti Güvenliği

Aşağıdaki senaryoda, Windows Communication Foundation (WCF) ileti güvenliği tarafından güvenliği sağlanan bir istemci ve hizmet gösterilmektedir. Tasarım hedefi, gelecekte daha zengin talep tabanlı bir modeli destekleyebilecek şekilde aktarım güvenliği yerine ileti güvenliğini kullanmaktır. Yetkilendirme için zengin talepleri kullanma hakkında daha fazla bilgi için bkz. Kimlik Modeli ile Beyanları ve Yetkilendirmeyi Yönetme.

Örnek bir uygulama için bkz. Anonim Mesaj Güvenliği.

Anonim istemci ile mesaj güvenliği

Karakteristik Açıklama
Güvenlik Modu Mesaj
Birlikte çalışabilirlik Yalnızca WCF
Kimlik Doğrulaması (Sunucu) İlk anlaşma için sunucu kimlik doğrulaması gerekir, ancak istemci kimlik doğrulaması gerekmez
Kimlik Doğrulaması (İstemci) Hiç kimse
Dürüstlük Evet, paylaşılan güvenlik bağlamı kullanma
Gizlilik Evet, paylaşılan güvenlik bağlamı kullanma
Taşıma HTTP

Hizmet

Aşağıdaki kod ve yapılandırma bağımsız olarak çalıştırılacaktır. Aşağıdakilerden birini yapın:

  • Yapılandırma olmadan kodu kullanarak tek başına bir hizmet oluşturun.

  • Sağlanan yapılandırmayı kullanarak bir hizmet oluşturun, ancak hiçbir uç nokta tanımlamayın.

Kod

Aşağıdaki kod, ileti güvenliği kullanan bir hizmet uç noktasının nasıl oluşturulacağını gösterir.

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

// Create the URI for the endpoint.
Uri httpUri = new Uri("http://localhost/Calculator");

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

// Specify a certificate to authenticate the service.
myServiceHost.Credentials.ServiceCertificate.SetCertificate(
    StoreLocation.LocalMachine,
    StoreName.My,
    X509FindType.FindByThumbprint,
    "00000000000000000000000000000000");

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

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

' Create the URI for the endpoint.
Dim httpUri As New Uri("http://localhost/Calculator")

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

' Specify a certificate to authenticate the service.
myServiceHost.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, _
StoreName.My, X509FindType.FindByThumbprint, "00000000000000000000000000000000")

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

' Close the service.
myServiceHost.Close()

Konfigürasyon

Kod yerine aşağıdaki yapılandırma kullanılabilir. Hizmet davranışı öğesi, istemcide hizmetin kimliğini doğrulamak için kullanılan bir sertifikayı belirtmek için kullanılır. Hizmet öğesi özniteliğini kullanarak behaviorConfiguration davranışı belirtmelidir. bağlama öğesi, istemci kimlik bilgisi türünün olduğunu Nonebelirtir ve anonim istemcilerin hizmeti kullanmasına izin verir.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceCredentialsBehavior">
          <serviceCredentials>
            <serviceCertificate findValue="contoso.com"
                                storeLocation="LocalMachine"
                                storeName="My" />
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="ServiceCredentialsBehavior"
               name="ServiceModel.Calculator">
        <endpoint address="http://localhost/Calculator"
                  binding="wsHttpBinding"
                  bindingConfiguration="WSHttpBinding_ICalculator"
                  name="CalculatorService"
                  contract="ServiceModel.ICalculator" />
      </service>
    </services>
    <bindings>
      <wsHttpBinding>
        <binding name="WSHttpBinding_ICalculator" >
          <security mode="Message">
            <message clientCredentialType="None" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <client />
  </system.serviceModel>
</configuration>

Müşteri

Aşağıdaki kod ve yapılandırma bağımsız olarak çalıştırılacaktır. Aşağıdakilerden birini yapın:

  • Kodu (ve istemci kodunu) kullanarak tek başına bir istemci oluşturun.

  • Hiçbir uç nokta adresi tanımlamayan bir istemci oluşturun. Bunun yerine, yapılandırma adını bağımsız değişken olarak alan istemci yapıcıyı kullanın. Örneğin:

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

Kod

Aşağıdaki kod istemcinin bir örneğini oluşturur. Bağlama, ileti modu güvenliğini kullanır ve istemci kimlik bilgisi türü yok olarak ayarlanır.

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

// Create the endpoint address.
EndpointAddress ea = new
    EndpointAddress("http://localhost/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 WSHttpBinding()
myBinding.Security.Mode = SecurityMode.Message
myBinding.Security.Message.ClientCredentialType = MessageCredentialType.None

' Create the endpoint address.
Dim ea As New EndpointAddress("http://localhost/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

Konfigürasyon

Aşağıdaki kod istemciyi yapılandırıyor.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="WSHttpBinding_ICalculator" >
          <security mode="Message">
            <message clientCredentialType="None" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://machineName/Calculator"
        binding="wsHttpBinding"
        bindingConfiguration="WSHttpBinding_ICalculator"
        contract="ICalculator"
        name="WSHttpBinding_ICalculator">
        <identity>
          <dns value="contoso.com" />
        </identity>
      </endpoint>
    </client>
  </system.serviceModel>
</configuration>

Ayrıca bakınız