Dela via


Gör så här: Ange ett maxursnedställt

Tidskritiska funktioner kan spåras ur om klockinställningarna på två datorer är olika. För att minimera den här möjligheten kan du ange egenskapen MaxClockSkew till en TimeSpan. Den här egenskapen är tillgänglig i två klasser:

LocalClientSecuritySettings

LocalServiceSecuritySettings

Viktigt!

För en säker konversation måste ändringar i MaxClockSkew egenskapen göras när tjänsten eller klienten startas. För att göra detta måste du ange egenskapen för den SecurityBindingElement som returneras av SecureConversationSecurityTokenParameters.BootstrapSecurityBindingElement egenskapen.

Om du vill ändra egenskapen för en av bindningarna som tillhandahålls av systemet måste du hitta säkerhetsbindningselementet i samlingen med bindningar och ange MaxClockSkew egenskapen till ett nytt värde. Två klasser härleds från SecurityBindingElement: SymmetricSecurityBindingElement och AsymmetricSecurityBindingElement. När du hämtar säkerhetsbindningen från samlingen måste du skicka till någon av dessa typer för att kunna ange MaxClockSkew egenskapen korrekt. I följande exempel används en WSHttpBinding, som använder SymmetricSecurityBindingElement. En lista som anger vilken typ av säkerhetsbindning som ska användas i varje bindning som tillhandahålls av systemet finns i Bindningar som tillhandahålls av systemet.

Så här skapar du en anpassad bindning med ett nytt klockförskjutningsvärde i kod

  1. Skapa en instans av en WSHttpBinding klass och ange dess säkerhetsläge till SecurityMode.Message.

  2. Skapa en ny instans av BindingElementCollection klassen genom att anropa CreateBindingElements metoden.

  3. Find Använd -metoden för BindingElementCollection klassen för att hitta säkerhetsbindningselementet.

  4. När du använder Find metoden gjuter du till den faktiska typen. Exemplet nedan genererar SymmetricSecurityBindingElement typen .

  5. MaxClockSkew Ange egenskapen för säkerhetsbindningselementet.

  6. Skapa en ServiceHost med lämplig tjänsttyp och basadress.

  7. AddServiceEndpoint Använd metoden för att lägga till en slutpunkt och inkludera 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
    
    

Så här anger du MaxClockSkew i konfigurationen

  1. Skapa en customBinding> i< avsnittet bindningselement>.<

  2. Skapa ett <bindningselement> och ange name attributet till ett lämpligt värde. I följande exempel anges det till MaxClockSkewBinding.

  3. Lägg till ett kodningselement. Exemplet nedan lägger till en <textMessageEncoding>.

  4. Lägg till ett <säkerhetselement> och ange authenticationMode attributet till en lämplig inställning. I följande exempel anger du attributet till Kerberos för att ange att tjänsten använder Windows-autentisering.

  5. Lägg till en localService Inställningar> och ange maxClockSkew attributet till ett värde i form av "##:##:##".< I följande exempel anges den till 7 minuter. Du kan också lägga till en <localService Inställningar> och ange maxClockSkew attributet till en lämplig inställning.

  6. Lägg till ett transportelement. I följande exempel används en <httpTransport>.

  7. För en säker konversation måste säkerhetsinställningarna ske vid bootstrap i elementet <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>  
    

Se även