Condividi tramite


Procedura: impostare lo sfasamento massimo dei segnali di clock

È possibile un malfunzionamento delle funzioni dipendenti dall'orario quando le impostazioni dell'orologio in due computer sono differenti. Per limitare questo problema, è possibile impostare la proprietà MaxClockSkew su un TimeSpan. Questa proprietà è disponibile in due classi:

LocalClientSecuritySettings

LocalServiceSecuritySettings

Importante

Per una conversazione sicura, è necessario apportare modifiche alla proprietà MaxClockSkew quando viene eseguito il bootstrap del servizio o del client. A tale scopo, è necessario impostare la proprietà sul SecurityBindingElement restituito dalla proprietà SecureConversationSecurityTokenParameters.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. Le due classi derivano da SecurityBindingElement: SymmetricSecurityBindingElement e 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. Nell'esempio seguente viene utilizzato WSHttpBinding che utilizza SymmetricSecurityBindingElement. Per un elenco che specifica quale tipo di binding di sicurezza usare in ogni binding fornito dal sistema, vedere Binding forniti dal sistema.

Per creare un'associazione personalizzata con un nuovo valore dello sfasamento dei segnali di clock nel codice

Avviso

Aggiungere riferimenti agli spazi dei nomi seguenti nel codice: System.ServiceModel.Channels, System.ServiceModel.Description, System.Security.Permissions e System.ServiceModel.Security.Tokens.

  1. Creare un'istanza della classe WSHttpBinding e impostarne la modalità di sicurezza su SecurityMode.Message.

  2. Creare una nuova istanza della classe BindingElementCollection chiamando il metodo CreateBindingElements.

  3. Utilizzare il metodo Find della classe BindingElementCollection per trovare l'elemento di associazione di sicurezza.

  4. Quando si utilizza il metodo Find, eseguire il cast al tipo effettivo. Nell'esempio seguente viene eseguito il cast al tipo SymmetricSecurityBindingElement.

  5. Impostare la proprietà MaxClockSkew sull'elemento di associazione di sicurezza.

  6. Creare un ServiceHost con un tipo di servizio e un indirizzo di base appropriati.

  7. Utilizzare il metodo AddServiceEndpoint per aggiungere un endpoint e includere 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 configurazione

  1. Creare un elemento <customBinding> nella sezione <Elemento di binding>.

  2. Creare un elemento di <binding> e impostare l'attributo name su un valore appropriato. Nell'esempio seguente viene impostato su MaxClockSkewBinding.

  3. Aggiungere un elemento di codifica. L'esempio seguente aggiunge un elemento <textMessageEncoding>.

  4. Aggiungere un elemento <security> e impostare l'attributo authenticationMode su un valore appropriato. Nell'esempio seguente l'attributo viene impostato su Kerberos per specificare che il servizio utilizza l'autenticazione di Windows.

  5. Aggiungere un elemento <localServiceSettings> e impostare l'attributo maxClockSkew su un valore sotto forma di "##:##:##". Nell'esempio seguente viene impostato su 7 minuti. Facoltativamente, aggiungere un elemento <localServiceSettings> e impostare l'attributo maxClockSkew su un valore appropriato.

  6. Aggiungere un elemento trasporto. Nell'esempio seguente viene usato un elemento <httpTransport>.

  7. Per una conversazione sicura, le impostazioni di sicurezza devono verificarsi nel bootstrap nell'elemento <secureConversationBootstrap>.

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

Vedi anche