Udostępnij za pośrednictwem


Instrukcje: ustawianie maksymalnego przesunięcia czasowego zegara

Funkcje krytyczne dla czasu można wykoleić, jeśli ustawienia zegara na dwóch komputerach są różne. Aby wyeliminować tę możliwość, możesz ustawić MaxClockSkew właściwość na TimeSpanwartość . Ta właściwość jest dostępna w dwóch klasach:

LocalClientSecuritySettings

LocalServiceSecuritySettings

Ważne

W przypadku bezpiecznej konwersacji należy wprowadzić zmiany MaxClockSkew we właściwości podczas uruchamiania usługi lub klienta. W tym celu należy ustawić właściwość zwróconą SecurityBindingElementSecureConversationSecurityTokenParameters.BootstrapSecurityBindingElement przez właściwość .

Aby zmienić właściwość na jednym z powiązań dostarczonych przez system, należy znaleźć element powiązania zabezpieczeń w kolekcji powiązań i ustawić MaxClockSkew właściwość na nową wartość. Dwie klasy pochodzą z klasy SecurityBindingElement: SymmetricSecurityBindingElement i AsymmetricSecurityBindingElement. Podczas pobierania powiązania zabezpieczeń z kolekcji należy rzutować na jeden z tych typów, aby poprawnie ustawić MaxClockSkew właściwość. W poniższym przykładzie użyto elementu WSHttpBinding, który używa elementu SymmetricSecurityBindingElement. Aby uzyskać listę określającą typ powiązania zabezpieczeń do użycia w każdym powiązaniu dostarczonym przez system, zobacz Powiązania dostarczone przez system.

Aby utworzyć niestandardowe powiązanie z nową wartością niesymetryczności zegara w kodzie

Ostrzeżenie

Dodaj odwołania do następujących przestrzeni nazw w kodzie: System.ServiceModel.Channels, , System.ServiceModel.DescriptionSystem.Security.Permissionsi System.ServiceModel.Security.Tokens.

  1. Utwórz wystąpienie WSHttpBinding klasy i ustaw jego tryb zabezpieczeń na SecurityMode.Message.

  2. Utwórz nowe wystąpienie BindingElementCollection klasy, wywołując metodę CreateBindingElements .

  3. Find Użyj metody BindingElementCollection klasy, aby znaleźć element powiązania zabezpieczeń.

  4. W przypadku używania Find metody rzutowanie do rzeczywistego typu. Poniższy przykład rzutuje na SymmetricSecurityBindingElement typ.

  5. MaxClockSkew Ustaw właściwość elementu powiązania zabezpieczeń.

  6. Utwórz element z odpowiednim typem ServiceHost usługi i adresem podstawowym.

  7. AddServiceEndpoint Użyj metody , aby dodać punkt końcowy i dołączyć element 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
    
    

Aby ustawić wartość MaxClockSkew w konfiguracji

  1. Utwórz element customBinding> w< sekcji elementu bindings>.<

  2. <Utwórz element powiązania> i ustaw name atrybut na odpowiednią wartość. Poniższy przykład ustawia go na MaxClockSkewBindingwartość .

  3. Dodaj element kodowania. Poniższy przykład dodaje tekstMessageEncoding>.<

  4. <Dodaj element zabezpieczeń> i ustaw authenticationMode atrybut na odpowiednie ustawienie. W poniższym przykładzie ustawiono atrybut , aby Kerberos określić, że usługa korzysta z uwierzytelniania systemu Windows.

  5. Dodaj wartość <localService Ustawienia> i ustaw maxClockSkew atrybut na wartość w postaci "##:##:##". Poniższy przykład ustawia go na 7 minut. Opcjonalnie dodaj wartość <localService Ustawienia> i ustaw maxClockSkew atrybut na odpowiednie ustawienie.

  6. Dodaj element transportu. W poniższym przykładzie użyto protokołu httpTransport>.<

  7. W przypadku bezpiecznej konwersacji ustawienia zabezpieczeń muszą występować podczas uruchamiania w elemecie 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>  
    

Zobacz też