Procedura: impostare lo sfasamento massimo dei segnali di clockHow to: Set a Max Clock Skew

È possibile un malfunzionamento delle funzioni dipendenti dall'orario quando le impostazioni dell'orologio in due computer sono differenti.Time-critical functions can be derailed if the clock settings on two computers are different. Per limitare questo problema, è possibile impostare la proprietà MaxClockSkew su un TimeSpan.To mitigate this possibility, you can set the MaxClockSkew property to a TimeSpan. Questa proprietà è disponibile in due classi:This property is available on two classes:

LocalClientSecuritySettings

LocalServiceSecuritySettings

Importante

Importante per una conversazione protetta, le modifiche per il MaxClockSkew proprietà deve essere resa quando il servizio o il client viene avviato automaticamente.Important For a secure conversation, changes to the MaxClockSkew property must be made when the service or client is bootstrapped. A tale scopo, è necessario impostare la proprietà sul SecurityBindingElement restituito dal BootstrapSecurityBindingElement.To do this, you must set the property on the SecurityBindingElement returned by the BootstrapSecurityBindingElement.

Per modificare la proprietà in una delle associazioni fornite dal sistema, è necessario trovare l'elemento di associazione di sicurezza nella raccolta di associazioni e impostare la proprietà MaxClockSkew su un valore nuovo.To change the property on one of the system-provided bindings, you must find the security binding element in the collection of bindings and set the MaxClockSkew property to a new value. Le due classi derivano da SecurityBindingElement: SymmetricSecurityBindingElement e AsymmetricSecurityBindingElement.Two classes derive from the SecurityBindingElement: SymmetricSecurityBindingElement and AsymmetricSecurityBindingElement. Quando si recupera l'associazione di sicurezza dalla raccolta, è necessario eseguire il cast a uno di questi tipi per impostare correttamente la proprietà MaxClockSkew.When retrieving the security binding from the collection, you must cast to one of these types in order to correctly set the MaxClockSkew property. Nell'esempio seguente viene utilizzato WSHttpBinding che utilizza SymmetricSecurityBindingElement.The following example uses a WSHttpBinding, which uses the SymmetricSecurityBindingElement. Per un elenco che specifica quale tipo di associazione di sicurezza da utilizzare in ogni associazione fornita dal sistema, vedere associazioni fornite dal sistema.For a list that specifies which type of security binding to use in each system-provided binding, see System-Provided Bindings.

Per creare un'associazione personalizzata con un nuovo valore dello sfasamento dei segnali di clock nel codiceTo create a custom binding with a new clock skew value in code

  1. Creare un'istanza della classe WSHttpBinding e impostarne la modalità di sicurezza su Message.Create an instance of a WSHttpBinding class and set its security mode to Message.

  2. Creare una nuova istanza della classe BindingElementCollection chiamando il metodo CreateBindingElements.Create a new instance of the BindingElementCollection class by calling the CreateBindingElements method.

  3. Utilizzare il metodo Find della classe BindingElementCollection per trovare l'elemento di associazione di sicurezza.Use the Find method of the BindingElementCollection class to find the security binding element.

  4. Quando si utilizza il metodo Find, eseguire il cast al tipo effettivo.When using the Find method, cast to the actual type. Nell'esempio seguente viene eseguito il cast al tipo SymmetricSecurityBindingElement.The example below casts to the SymmetricSecurityBindingElement type.

  5. Impostare la proprietà MaxClockSkew sull'elemento di associazione di sicurezza.Set the MaxClockSkew property on the security binding element.

  6. Creare un ServiceHost con un tipo di servizio e un indirizzo di base appropriati.Create a ServiceHost with an appropriate service type and base address.

  7. Utilizzare il metodo AddServiceEndpoint per aggiungere un endpoint e includere CustomBinding.Use the AddServiceEndpoint method to add an endpoint and include the CustomBinding.

    // 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
    
    

Per impostare MaxClockSkew nella configurazioneTo set the MaxClockSkew in configuration

  1. Creare un <customBinding > nel <associazioni > sezione dell'elemento.Create a <customBinding> in the <bindings> element section.

  2. Creare un <associazione > elemento e impostare il name attributo su un valore appropriato.Create a <binding> element and set the name attribute to an appropriate value. Nell'esempio seguente viene impostato su MaxClockSkewBinding.The following example sets it to MaxClockSkewBinding.

  3. Aggiungere un elemento di codifica.Add an encoding element. Nell'esempio seguente aggiunge un <textMessageEncoding >.The example below adds a <textMessageEncoding>.

  4. Aggiungere un <sicurezza > elemento e impostare il authenticationMode attributo per l'impostazione appropriata.Add a <security> element and set the authenticationMode attribute to an appropriate setting. Nell'esempio seguente l'attributo viene impostato su Kerberos per specificare che il servizio utilizza l'autenticazione di Windows.The following example set the attribute to Kerberos to specify that the service use Windows authentication.

  5. Aggiungere un <localServiceSettings > e impostare il maxClockSkew attributo su un valore sotto forma di "##:##:##".Add a <localServiceSettings> and set the maxClockSkew attribute to a value in the form of "##:##:##". Nell'esempio seguente viene impostato su 7 minuti.The following example sets it to 7 minutes. Facoltativamente, aggiungere un <localServiceSettings > e impostare il maxClockSkew attributo per l'impostazione appropriata.Optionally, add a <localServiceSettings> and set the maxClockSkew attribute to an appropriate setting.

  6. Aggiungere un elemento trasporto.Add a transport element. Nell'esempio seguente viene utilizzato un <httpTransport >.The following example uses an <httpTransport>.

  7. Per una conversazione protetta, le impostazioni di sicurezza devono verificarsi al programma di avvio nel <secureConversationBootstrap > elemento.For a secure conversation, the security settings must occur at the bootstrap in the <secureConversationBootstrap> element.

    <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>  
    

Vedere ancheSee Also

LocalClientSecuritySettings
LocalServiceSecuritySettings
CustomBinding
Procedura: Creare un'associazione personalizzata usando SecurityBindingElementHow to: Create a Custom Binding Using the SecurityBindingElement