Partilhar via


Como: Definir uma inclinação máxima do relógio

As funções críticas de tempo podem ser descarriladas se as configurações do relógio em dois computadores forem diferentes. Para atenuar essa possibilidade, você pode definir a MaxClockSkew propriedade como .TimeSpan Esta propriedade está disponível em duas classes:

LocalClientSecuritySettings

LocalServiceSecuritySettings

Importante

Para uma conversa segura, as alterações na MaxClockSkew propriedade devem ser feitas quando o serviço ou cliente é inicializado. Para fazer isso, você deve definir a propriedade no SecurityBindingElement devolvido pela SecureConversationSecurityTokenParameters.BootstrapSecurityBindingElement propriedade.

Para alterar a propriedade em uma das associações fornecidas pelo sistema, você deve encontrar o elemento de ligação de segurança na coleção de associações e definir a MaxClockSkew propriedade como um novo valor. Duas classes derivam do SecurityBindingElement: SymmetricSecurityBindingElement e AsymmetricSecurityBindingElement. Ao recuperar a vinculação de segurança da coleção, você deve converter para um desses tipos para definir corretamente a MaxClockSkew propriedade. O exemplo a seguir usa um WSHttpBinding, que usa o SymmetricSecurityBindingElementarquivo . Para obter uma lista que especifica qual tipo de associação de segurança usar em cada associação fornecida pelo sistema, consulte Ligações fornecidas pelo sistema.

Para criar uma associação personalizada com um novo valor de distorção de relógio no código

  1. Crie uma instância de uma WSHttpBinding classe e defina seu modo de segurança como SecurityMode.Message.

  2. Crie uma nova instância da BindingElementCollection classe chamando o CreateBindingElements método.

  3. Use o Find método da classe para localizar o elemento de vinculação de BindingElementCollection segurança.

  4. Ao usar o Find método, converta para o tipo real. O exemplo abaixo molda para o SymmetricSecurityBindingElement tipo.

  5. Defina a MaxClockSkew propriedade no elemento de vinculação de segurança.

  6. Crie um ServiceHost com um tipo de serviço e endereço base apropriados.

  7. Use o AddServiceEndpoint método para adicionar um ponto de extremidade e incluir o 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
    
    

Para definir o MaxClockSkew na configuração

  1. Crie um customBinding> na <seção do elemento bindings>.<

  2. Crie um <elemento binding> e defina o name atributo como um valor apropriado. O exemplo a seguir o define como MaxClockSkewBinding.

  3. Adicione um elemento de codificação. O exemplo abaixo adiciona um textMessageEncoding>.<

  4. Adicione um <elemento de segurança> e defina o authenticationMode atributo para uma configuração apropriada. O exemplo a seguir define o atributo como Kerberos para especificar que o serviço use a autenticação do Windows.

  5. Adicione um <localServiceSettings> e defina o maxClockSkew atributo como um valor na forma de "##:##:##". O exemplo a seguir o define como 7 minutos. Opcionalmente, adicione um <localServiceSettings> e defina o maxClockSkew atributo para uma configuração apropriada.

  6. Adicione um elemento de transporte. O exemplo a seguir usa um httpTransport>.<

  7. Para uma conversa segura, as configurações de segurança devem ocorrer no bootstrap no 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>  
    

Consulte também