Procédure : définir une inclinaison de l’horloge maximale

Les fonctions à durée critique peuvent dérailler si les paramètres de l'horloge sont différents sur deux ordinateurs. Pour limiter cette possibilité, vous pouvez affecter à la propriété MaxClockSkew un TimeSpan. Cette propriété est disponible sur deux classes :

LocalClientSecuritySettings

LocalServiceSecuritySettings

Important

Pour une conversation sécurisée, les modifications de la propriété MaxClockSkew doivent être effectuées lorsque le service ou le client est initialisé. Pour ce faire, vous devez affecter à la propriété la valeur de SecurityBindingElement retourné par SecureConversationSecurityTokenParameters.BootstrapSecurityBindingElement.

Pour modifier la propriété sur l'une des liaisons fournies par le système, vous devez rechercher l'élément de liaison de sécurité dans la collection de liaisons et affecter une nouvelle valeur à la propriété MaxClockSkew. Deux classes dérivent de SecurityBindingElement : SymmetricSecurityBindingElement et AsymmetricSecurityBindingElement. Lorsque vous récupérez la liaison de sécurité de la collection, vous devez effectuer une conversion de type en l’un de ces types afin de définir correctement la propriété MaxClockSkew. L'exemple suivant utilise un WSHttpBinding, qui utilise SymmetricSecurityBindingElement. Pour obtenir une liste qui spécifie quel type de liaison de sécurité utiliser dans chaque liaison fournie par le système, consultez Liaisons fournies par le système.

Pour créer une liaison personnalisée avec une nouvelle valeur d'inclinaison de l'horloge dans du code

Avertissement

Ajoutez des références aux espaces de noms suivants dans votre code : System.ServiceModel.Channels, System.ServiceModel.Description, System.Security.Permissions et System.ServiceModel.Security.Tokens.

  1. Créez une instance d'une classe WSHttpBinding et choisissez le mode de sécurité SecurityMode.Message.

  2. Créez une nouvelle instance de la classe BindingElementCollection en appelant la méthode CreateBindingElements.

  3. Utilisez la méthode Find de la classe BindingElementCollection pour rechercher l’élément de liaison de sécurité.

  4. Lorsque vous utilisez la méthode Find, effectuez une conversion de type au type réel. L'exemple suivant effectue une conversion de type au type SymmetricSecurityBindingElement.

  5. Définissez la propriété MaxClockSkew sur l’élément de liaison de sécurité.

  6. Créez un ServiceHost avec un type de service approprié et une adresse de base.

  7. Utilisez la méthode AddServiceEndpoint pour ajouter un point de terminaison et inclure la 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
    
    

Pour définir MaxClockSkew dans la configuration

  1. Créez un élément <customBinding> dans la section de l’élément <bindings>.

  2. Créez un élément <binding> et affectez à l’attribut name une valeur adéquate. L'exemple suivant lui affecte la valeur MaxClockSkewBinding.

  3. Ajoutez un élément d'encodage. L’exemple ci-dessous ajoute un élément <textMessageEncoding>.

  4. Ajoutez un élément <security>, puis affectez à l’attribut authenticationMode une valeur appropriée. L'exemple suivant affecte à l'attribut la valeur Kerberos pour spécifier que le service utilise l'authentification Windows.

  5. Ajoutez un élément <localServiceSettings> et affectez à l’attribut maxClockSkew une valeur de la forme "##:##:##". L'exemple suivant lui attribue la valeur 7 minutes. Ajoutez éventuellement un élément <localServiceSettings> et affectez un paramètre approprié à l’attribut maxClockSkew.

  6. Ajoutez un élément de transport. L’exemple ci-dessous utilise un élément <httpTransport>.

  7. Pour une conversation sécurisée, les paramètres de sécurité doivent se produire à l’initialisation dans l’élément <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>  
    

Voir aussi