Procedure: Een maximale klokverschil instellen
Tijdkritieke functies kunnen worden ontspoord als de klokinstellingen op twee computers verschillen. Als u deze mogelijkheid wilt beperken, kunt u de MaxClockSkew
eigenschap instellen op een TimeSpan. Deze eigenschap is beschikbaar voor twee klassen:
Belangrijk
Voor een veilig gesprek moeten wijzigingen in de MaxClockSkew
eigenschap worden aangebracht wanneer de service of client wordt opgestart. Hiervoor moet u de eigenschap instellen op de SecurityBindingElement geretourneerde eigenschap door de SecureConversationSecurityTokenParameters.BootstrapSecurityBindingElement eigenschap.
Als u de eigenschap voor een van de door het systeem geleverde bindingen wilt wijzigen, moet u het beveiligingsbindingselement in de verzameling bindingen vinden en de MaxClockSkew
eigenschap instellen op een nieuwe waarde. Twee klassen zijn afgeleid van : SecurityBindingElementSymmetricSecurityBindingElement en AsymmetricSecurityBindingElement. Bij het ophalen van de beveiligingsbinding uit de verzameling moet u naar een van deze typen casten om de MaxClockSkew
eigenschap correct in te stellen. In het volgende voorbeeld wordt een WSHttpBinding, die gebruikmaakt van de SymmetricSecurityBindingElement. Zie Door het systeem geleverde bindingen voor een lijst die aangeeft welk type beveiligingsbinding moet worden gebruikt in elke door het systeem geleverde binding.
Een aangepaste binding maken met een nieuwe scheeftrekkende klokwaarde in code
Waarschuwing
Voeg verwijzingen toe naar de volgende naamruimten in uw code: System.ServiceModel.Channels, System.ServiceModel.Description, System.Security.Permissionsen System.ServiceModel.Security.Tokens.
Maak een exemplaar van een WSHttpBinding klasse en stel de beveiligingsmodus in op SecurityMode.Message.
Maak een nieuw exemplaar van de BindingElementCollection klasse door de CreateBindingElements methode aan te roepen.
Gebruik de Find methode van de BindingElementCollection klasse om het beveiligingsbindingselement te vinden.
Wanneer u de Find methode gebruikt, castt u naar het werkelijke type. In het SymmetricSecurityBindingElement onderstaande voorbeeld wordt het type omgezet.
Stel de MaxClockSkew eigenschap in op het beveiligingsbindingselement.
Maak een ServiceHost met een geschikt servicetype en basisadres.
Gebruik de AddServiceEndpoint methode om een eindpunt toe te voegen en de 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
De MaxClockSkew instellen in de configuratie
Maak een customBinding> in de <sectie bindingselement>.<
Maak een bindingselement <>en stel het
name
kenmerk in op een geschikte waarde. In het volgende voorbeeld wordt dit ingesteld opMaxClockSkewBinding
.Voeg een coderingselement toe. In het onderstaande voorbeeld wordt een textMessageEncoding toegevoegd>.<
Voeg een <beveiligingselement> toe en stel het
authenticationMode
kenmerk in op een geschikte instelling. In het volgende voorbeeld wordt het kenmerk ingesteld om op teKerberos
geven dat de service Windows-verificatie gebruikt.Voeg een <localService Instellingen> toe en stel het
maxClockSkew
kenmerk in op een waarde in de vorm van"##:##:##"
. In het volgende voorbeeld wordt dit ingesteld op 7 minuten. Voeg desgewenst een <localService Instellingen> toe en stel hetmaxClockSkew
kenmerk in op een geschikte instelling.Voeg een transportelement toe. In het volgende voorbeeld wordt een <httpTransport> gebruikt.
Voor een veilig gesprek moeten de beveiligingsinstellingen plaatsvinden bij de bootstrap in het element 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>