Vorgehensweise: Festlegen der maximalen Zeitdehnung (Uhrabweichung)How to: Set a Max Clock Skew

Zeitkritische Funktionen können behindert werden, wenn zwei Computer unterschiedliche Uhreinstellungen aufweisen.Time-critical functions can be derailed if the clock settings on two computers are different. Um diese Gefahr zu umgehen, können Sie für die MaxClockSkew-Eigenschaft einen TimeSpan-Wert festlegen.To mitigate this possibility, you can set the MaxClockSkew property to a TimeSpan. Diese Eigenschaft ist für zwei Klassen verfügbar:This property is available on two classes:

LocalClientSecuritySettings

LocalServiceSecuritySettings

Wichtig

Wichtig für eine sichere Konversation müssen Änderungen an der MaxClockSkew Eigenschaft muss vorgenommen werden, wenn der Dienst oder Client, einem Bootstrapping unterzogen wird.Important For a secure conversation, changes to the MaxClockSkew property must be made when the service or client is bootstrapped. Zu diesem Zweck müssen Sie die Eigenschaft festlegen, auf die SecurityBindingElement zurückgegebenes der BootstrapSecurityBindingElement.To do this, you must set the property on the SecurityBindingElement returned by the BootstrapSecurityBindingElement.

Um die Eigenschaft bei einer der vom System bereitgestellten Bindungen zu ändern, suchen Sie das Sicherheitsbindungselement in der Bindungsauflistung und legen für die MaxClockSkew-Eigenschaft einen neuen Wert fest.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. Von SecurityBindingElement werden zwei Klassen abgeleitet: SymmetricSecurityBindingElement und AsymmetricSecurityBindingElement.Two classes derive from the SecurityBindingElement: SymmetricSecurityBindingElement and AsymmetricSecurityBindingElement. Wenn Sie die Sicherheitsbindung aus der Auflistung abrufen, müssen Sie eine Umwandlung in einen dieser Typen durchführen, damit die MaxClockSkew-Eigenschaft richtig festgelegt werden kann.When retrieving the security binding from the collection, you must cast to one of these types in order to correctly set the MaxClockSkew property. Im folgenden Beispiel wird eine WSHttpBinding verwendet, die die SymmetricSecurityBindingElement-Klasse nutzt.The following example uses a WSHttpBinding, which uses the SymmetricSecurityBindingElement. Eine Liste, der angibt, welche Art von in jeder vom System bereitgestellte Bindung verwendet, finden Sie unter sicherheitsbindungsarten Bindungen.For a list that specifies which type of security binding to use in each system-provided binding, see System-Provided Bindings.

So erstellen Sie eine benutzerdefinierte Bindung mit einem neuen Zeitdehnungswert im CodeTo create a custom binding with a new clock skew value in code

  1. Erstellen Sie eine Instanz einer WSHttpBinding-Klasse, und legen Sie als Sicherheitsmodus Message fest.Create an instance of a WSHttpBinding class and set its security mode to Message.

  2. Erstellen Sie eine neue Instanz der BindingElementCollection-Klasse durch Aufruf der CreateBindingElements-Methode.Create a new instance of the BindingElementCollection class by calling the CreateBindingElements method.

  3. Suchen Sie mit der Find-Methode der BindingElementCollection-Klasse nach dem Sicherheitsbindungselement.Use the Find method of the BindingElementCollection class to find the security binding element.

  4. Bei Verwendung der Find-Methode führen Sie eine Umwandlung in den tatsächlichen Typ durch.When using the Find method, cast to the actual type. Im folgenden Beispiel wird eine Umwandlung in den SymmetricSecurityBindingElement-Typ vorgenommen.The example below casts to the SymmetricSecurityBindingElement type.

  5. Legen Sie für das Sicherheitsbindungselement die MaxClockSkew-Eigenschaft fest.Set the MaxClockSkew property on the security binding element.

  6. Erstellen Sie einen ServiceHost mit geeignetem Diensttyp und entsprechender Basisadresse.Create a ServiceHost with an appropriate service type and base address.

  7. Fügen Sie mit der AddServiceEndpoint-Methode einen Endpunkt hinzu, und nehmen Sie die CustomBinding auf.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
    
    

So legen Sie MaxClockSkew in der Konfiguration festTo set the MaxClockSkew in configuration

  1. Erstellen einer <CustomBinding > in der <Bindungen > -Elementabschnitt.Create a <customBinding> in the <bindings> element section.

  2. Erstellen einer <Bindung > Element, und legen die name -Attribut auf einen geeigneten Wert.Create a <binding> element and set the name attribute to an appropriate value. Im folgenden Beispiel wird das Attribut auf den Wert MaxClockSkewBinding festgelegt.The following example sets it to MaxClockSkewBinding.

  3. Fügen Sie ein Codierungselement hinzu.Add an encoding element. Das folgende Beispiel fügt eine <TextMessageEncoding >.The example below adds a <textMessageEncoding>.

  4. Hinzufügen einer <Sicherheit > Element, und legen die authenticationMode -Attribut auf eine geeignete Einstellung.Add a <security> element and set the authenticationMode attribute to an appropriate setting. Im folgenden Beispiel wird das Attribut auf Kerberos festgelegt, um anzugeben, dass der Dienst die Windows-Authentifizierung verwendet.The following example set the attribute to Kerberos to specify that the service use Windows authentication.

  5. Hinzufügen einer <LocalServiceSettings > und legen Sie die maxClockSkew -Attribut auf einen Wert in Form von "##:##:##".Add a <localServiceSettings> and set the maxClockSkew attribute to a value in the form of "##:##:##". Im folgenden Beispiel werden sieben Minuten eingestellt.The following example sets it to 7 minutes. Fügen Sie eine <LocalServiceSettings > und legen Sie die maxClockSkew -Attribut auf eine geeignete Einstellung.Optionally, add a <localServiceSettings> and set the maxClockSkew attribute to an appropriate setting.

  6. Fügen Sie ein Transportelement hinzu.Add a transport element. Im folgenden Beispiel wird ein <HttpTransport >.The following example uses an <httpTransport>.

  7. Für eine sichere Konversation müssen die Sicherheitseinstellungen beim Bootstrap im auftreten der <SecureConversationBootstrap > Element.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>  
    

Siehe auchSee Also

LocalClientSecuritySettings
LocalServiceSecuritySettings
CustomBinding
Vorgehensweise: Erstellen einer benutzerdefinierten Bindung mit dem SecurityBindingElementHow to: Create a Custom Binding Using the SecurityBindingElement