Vorgehensweise: Festlegen der maximalen Zeitdehnung (Uhrabweichung)

Zeitkritische Funktionen können behindert werden, wenn zwei Computer unterschiedliche Uhreinstellungen aufweisen. Um diese Gefahr zu umgehen, können Sie für die MaxClockSkew-Eigenschaft einen TimeSpan-Wert festlegen. Diese Eigenschaft ist für zwei Klassen verfügbar:

LocalClientSecuritySettings

LocalServiceSecuritySettings

Wichtig

Wichtig Für eine sichere Konversation müssen Änderungen an der MaxClockSkew-Eigenschaft vorgenommen werden, wenn das Bootstrapping für den Client oder Dienst aktiv ist. Legen Sie hierzu die Eigenschaft auf das vom SecurityBindingElement zurückgegebene BootstrapSecurityBindingElement fest.

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. Von SecurityBindingElement werden zwei Klassen abgeleitet: SymmetricSecurityBindingElement und 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. Im folgenden Beispiel wird eine WSHttpBinding verwendet, die die SymmetricSecurityBindingElement-Klasse nutzt. Eine Liste der Sicherheitsbindungsarten, die mit den einzelnen vom System bereitgestellten Bindungen verwendet werden müssen, finden Sie unter Vom System bereitgestellte Bindungen.

So erstellen Sie eine benutzerdefinierte Bindung mit einem neuen Zeitdehnungswert im Code

  1. Warnung

    Hinweis Fügen Sie Verweise auf die folgenden Namespaces im Code hinzu: System.ServiceModel.Channels, System.ServiceModel.Description, System.Security.Permissions und System.ServiceModel.Security.Tokens.

    Erstellen Sie eine Instanz einer WSHttpBinding-Klasse, und legen Sie als Sicherheitsmodus SecurityMode fest.

  2. Erstellen Sie eine neue Instanz der BindingElementCollection-Klasse durch Aufruf der CreateBindingElements-Methode.

  3. Suchen Sie mit der Find-Methode der BindingElementCollection-Klasse nach dem Sicherheitsbindungselement.

  4. Bei Verwendung der Find-Methode führen Sie eine Umwandlung in den tatsächlichen Typ durch. Im folgenden Beispiel wird eine Umwandlung in den SymmetricSecurityBindingElement-Typ vorgenommen.

  5. Legen Sie für das Sicherheitsbindungselement die MaxClockSkew-Eigenschaft fest.

  6. Erstellen Sie einen ServiceHost mit geeignetem Diensttyp und entsprechender Basisadresse.

  7. Fügen Sie mit der AddServiceEndpoint-Methode einen Endpunkt hinzu, und nehmen Sie die CustomBinding auf.

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

  1. Erstellen Sie ein <customBinding> im Elementabschnitt <Bindungen>.

  2. Erstellen Sie ein <Bindung>-Element, und legen Sie das name-Attribut auf einen geeigneten Wert fest. Im folgenden Beispiel wird das Attribut auf den Wert MaxClockSkewBinding festgelegt.

  3. Fügen Sie ein Codierungselement hinzu. Im folgenden Beispiel wird ein <textMessageEncoding> hinzugefügt.

  4. Fügen Sie ein <Sicherheit>-Elements hinzu, und legen Sie das authenticationMode-Attribut auf einen geeigneten Wert fest. Im folgenden Beispiel wird das Attribut auf Kerberos festgelegt, um anzugeben, dass der Dienst die Windows-Authentifizierung verwendet.

  5. Fügen Sie ein <localServiceSettings> hinzu, und legen Sie das maxClockSkew-Attribut auf einen Wert in Form von "##:##:##" fest. Im folgenden Beispiel werden sieben Minuten eingestellt. Fügen Sie optional ein <localServiceSettings> hinzu, und legen Sie das maxClockSkew-Attribut auf eine geeignete Einstellung fest.

  6. Fügen Sie ein Transportelement hinzu. Im folgenden Beispiel wird ein <httpTransport> verwendet.

  7. Für eine sichere Konversation müssen die Sicherheitseinstellungen beim Bootstrap im <secureConversationBootstrap>-Element auftreten.

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

LocalClientSecuritySettings
LocalServiceSecuritySettings
CustomBinding
Vorgehensweise: Erstellen einer benutzerdefinierten Bindung mit dem SecurityBindingElement