Aracılığıyla paylaş


Nasıl yapılır: Maksimum Saat Eğriltme Ayarlama

İki bilgisayarda saat ayarları farklıysa, zaman açısından kritik işlevler raydan çıkarılabilir. Bu olasılığı azaltmak için özelliğini olarak TimeSpanayarlayabilirsinizMaxClockSkew. Bu özellik iki sınıfta kullanılabilir:

LocalClientSecuritySettings

LocalServiceSecuritySettings

Önemli

Güvenli bir konuşma için, hizmet veya istemci önyüklemesi yapıldığında özelliğinde değişiklikler MaxClockSkew yapılmalıdır. Bunu yapmak için özelliği tarafından SecureConversationSecurityTokenParameters.BootstrapSecurityBindingElement döndürülen üzerinde SecurityBindingElement ayarlamanız gerekir.

Sistem tarafından sağlanan bağlamalardan birinde özelliğini değiştirmek için, bağlama koleksiyonunda güvenlik bağlaması öğesini bulmanız ve özelliğini yeni bir değere ayarlamanız MaxClockSkew gerekir. İki sınıf : SymmetricSecurityBindingElement ve AsymmetricSecurityBindingElement'den SecurityBindingElementtüretilir. Güvenlik bağlamasını koleksiyondan alırken, özelliği doğru şekilde ayarlamak için bu türlerden birine dönüştürmeniz MaxClockSkew gerekir. Aşağıdaki örnek, SymmetricSecurityBindingElementkullanan bir WSHttpBindingkullanır. Sistem tarafından sağlanan her bağlamada kullanılacak güvenlik bağlaması türünü belirten bir liste için bkz . Sistem Tarafından Sağlanan Bağlamalar.

Kodda yeni bir saat dengesizliği değeriyle özel bağlama oluşturmak için

  1. Bir WSHttpBinding sınıfın örneğini oluşturun ve güvenlik modunu olarak SecurityMode.Messageayarlayın.

  2. yöntemini çağırarak sınıfının yeni bir örneğini BindingElementCollectionCreateBindingElements oluşturun.

  3. Find Güvenlik bağlama öğesini bulmak için sınıfının yöntemini BindingElementCollection kullanın.

  4. yöntemi kullanılırken Find gerçek türe yayın. Aşağıdaki örnek türüne yayınlar SymmetricSecurityBindingElement .

  5. MaxClockSkew Güvenlik bağlama öğesinde özelliğini ayarlayın.

  6. Uygun hizmet türüne ve temel adrese sahip bir ServiceHost oluşturun.

  7. AddServiceEndpoint Bir uç nokta eklemek ve CustomBindingeklemek için yöntemini kullanın.

    // This method returns a custom binding created from a WSHttpBinding. Alter the method
    // to use the appropriate binding for your service, with the appropriate settings.
    public static Binding CreateCustomBinding(TimeSpan clockSkew)
    {
        WSHttpBinding standardBinding = new WSHttpBinding(SecurityMode.Message, true);
        CustomBinding myCustomBinding = new CustomBinding(standardBinding);
        SymmetricSecurityBindingElement security =
            myCustomBinding.Elements.Find<SymmetricSecurityBindingElement>();
        security.LocalClientSettings.MaxClockSkew = clockSkew;
        security.LocalServiceSettings.MaxClockSkew = clockSkew;
        // Get the System.ServiceModel.Security.Tokens.SecureConversationSecurityTokenParameters
        SecureConversationSecurityTokenParameters secureTokenParams =
            (SecureConversationSecurityTokenParameters)security.ProtectionTokenParameters;
        // From the collection, get the bootstrap element.
        SecurityBindingElement bootstrap = secureTokenParams.BootstrapSecurityBindingElement;
        // Set the MaxClockSkew on the bootstrap element.
        bootstrap.LocalClientSettings.MaxClockSkew = clockSkew;
        bootstrap.LocalServiceSettings.MaxClockSkew = clockSkew;
        return myCustomBinding;
    }
    
    private void Run()
    {
        // Create a custom binding using the method defined above. The MaxClockSkew is set to 30 minutes.
        Binding customBinding= CreateCustomBinding(TimeSpan.FromMinutes(30));
    
        // Create a ServiceHost instance, and add a metadata endpoint.
        // NOTE  When using Visual Studio, you must run as administrator.
        Uri baseUri = new Uri("http://localhost:1008/");
        ServiceHost sh = new ServiceHost(typeof(Calculator), baseUri);
    
        // Optional. Add a metadata endpoint. The method is defined below.
        AddMetadataEndpoint(ref sh);
    
        // Add an endpoint using the binding, and open the service.
        sh.AddServiceEndpoint(typeof(ICalculator), customBinding, "myCalculator");
    
        sh.Open();
        Console.WriteLine("Listening...");
        Console.ReadLine();
    }
    
    private void AddMetadataEndpoint(ref ServiceHost sh)
    {
        Uri mex = new Uri(@"http://localhost:1001/metadata/");
        ServiceMetadataBehavior sm = new ServiceMetadataBehavior();
        sm.HttpGetEnabled = true;
        sm.HttpGetUrl = mex;
        sh.Description.Behaviors.Add(sm);
    }
    
    
    ' This method returns a custom binding created from a WSHttpBinding. Alter the method 
    ' to use the appropriate binding for your service, with the appropriate settings.
    Public Shared Function CreateCustomBinding(ByVal clockSkew As TimeSpan) As Binding
    
        Dim standardBinding As WSHttpBinding = New WSHttpBinding(SecurityMode.Message, True)
        Dim myCustomBinding As CustomBinding = New CustomBinding(standardBinding)
        Dim security As SymmetricSecurityBindingElement = _
            myCustomBinding.Elements.Find(Of SymmetricSecurityBindingElement)()
        security.LocalClientSettings.MaxClockSkew = clockSkew
        security.LocalServiceSettings.MaxClockSkew = clockSkew
        ' Get the System.ServiceModel.Security.Tokens.SecureConversationSecurityTokenParameters 
        Dim secureTokenParams As SecureConversationSecurityTokenParameters = _
             CType(security.ProtectionTokenParameters, SecureConversationSecurityTokenParameters)
        ' From the collection, get the bootstrap element.
        Dim bootstrap As SecurityBindingElement = secureTokenParams.BootstrapSecurityBindingElement
        ' Set the MaxClockSkew on the bootstrap element.
        bootstrap.LocalClientSettings.MaxClockSkew = clockSkew
        bootstrap.LocalServiceSettings.MaxClockSkew = clockSkew
        Return myCustomBinding
    End Function
    
    Private Sub Run()
    
        ' Create a custom binding using the method defined above. The MaxClockSkew is set to 30 minutes. 
        Dim customBinding As Binding = CreateCustomBinding(TimeSpan.FromMinutes(30))
    
        ' Create a ServiceHost instance, and add a metadata endpoint.
        ' NOTE  When using Visual Studio, you must run as administrator.
        Dim baseUri As New Uri("http://localhost:1008/")
        Dim sh As New ServiceHost(GetType(Calculator), baseUri)
    
        ' Optional. Add a metadata endpoint. The method is defined below.
        AddMetadataEndpoint(sh)
    
        ' Add an endpoint using the binding, and open the service.
        sh.AddServiceEndpoint(GetType(ICalculator), customBinding, "myCalculator")
    
        sh.Open()
        Console.WriteLine("Listening...")
        Console.ReadLine()
    End Sub
    
    Private Sub AddMetadataEndpoint(ByRef sh As ServiceHost)
    
        Dim mex As New Uri("http://localhost:1011/metadata/")
        Dim sm As New ServiceMetadataBehavior()
        sm.HttpGetEnabled = True
        sm.HttpGetUrl = mex
        sh.Description.Behaviors.Add(sm)
    End Sub
    
    

Yapılandırmada MaxClockSkew'i ayarlamak için

  1. Bağlamalar öğesi bölümünde customBinding ><<oluşturun.>

  2. Bağlama <>öğesi oluşturun ve özniteliğini name uygun bir değere ayarlayın. Aşağıdaki örnek bunu olarak MaxClockSkewBindingayarlar.

  3. Bir kodlama öğesi ekleyin. Aşağıdaki örnekte textMessageEncoding <eklenmiştir>.

  4. Bir <güvenlik> öğesi ekleyin ve özniteliğini authenticationMode uygun bir ayara ayarlayın. Aşağıdaki örnek, hizmetin Windows kimlik doğrulaması kullandığını belirtmek için özniteliğini Kerberos olarak ayarlar.

  5. localService <Ayarlar> ekleyin ve özniteliğini biçiminde "##:##:##"bir değere ayarlayınmaxClockSkew. Aşağıdaki örnek bunu 7 dakikaya ayarlar. İsteğe bağlı olarak, localService <Ayarlar> ekleyin ve özniteliğini uygun bir ayara ayarlayınmaxClockSkew.

  6. Bir aktarım öğesi ekleyin. Aşağıdaki örnekte httpTransport <>kullanılır.

  7. Güvenli bir konuşma için güvenlik ayarlarının secureConversationBootstrap öğesindeki <bootstrap'ta> gerçekleşmesi gerekir.

    <bindings>  
      <customBinding>  
        <binding name="MaxClockSkewBinding">  
            <textMessageEncoding />  
            <security authenticationMode="Kerberos">  
               <localClientSettings maxClockSkew="00:07:00" />  
               <localServiceSettings maxClockSkew="00:07:00" />  
               <secureConversationBootstrap>  
                  <localClientSettings maxClockSkew="00:30:00" />  
                  <localServiceSettings maxClockSkew="00:30:00" />  
               </secureConversationBootstrap>  
            </security>  
            <httpTransport />  
        </binding>  
      </customBinding>  
    </bindings>  
    

Ayrıca bkz.