Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Las funciones críticas en el tiempo se pueden desbaratar si los ajustes del reloj en dos equipos son diferentes. Para mitigar esta posibilidad, puede establecer la propiedad MaxClockSkew en TimeSpan. Esta propiedad está disponible en dos clases:
![]() |
---|
Importante Para una conversación segura, los cambios en la propiedad MaxClockSkew se deben realizar cuando el servicio o cliente se arranca. Para ello, debe establecer la propiedad en el objeto SecurityBindingElement devuelto por BootstrapSecurityBindingElement. |
Para cambiar la propiedad en uno de los enlaces proporcionados por el sistema, debe encontrar el elemento de enlace de seguridad en la colección de enlaces y establecer la propiedad MaxClockSkew en un nuevo valor. Dos clases derivan de SecurityBindingElement: SymmetricSecurityBindingElement y AsymmetricSecurityBindingElement. Al recuperar el enlace de seguridad de la colección, debe convertir a uno de estos tipos para establecer correctamente la propiedad MaxClockSkew. El siguiente ejemplo usa un WSHttpBinding, que utiliza el SymmetricSecurityBindingElement. Para obtener una lista que especifica qué tipo de enlace de seguridad utilizar en cada enlace proporcionado por el sistema, vea Enlaces proporcionados por el sistema.
Para crear un enlace personalizado con un nuevo valor de sesgo de reloj en código
-
Nota: Agregue referencias a los espacios de nombres siguientes en el código: System.ServiceModel.Channels, System.ServiceModel.Description, System.Security.Permissions y System.ServiceModel.Security.Tokens. Cree una instancia de una clase WSHttpBinding y establezca su modo de seguridad en Message.
Cree una nueva instancia de la clase BindingElementCollection llamando al método CreateBindingElements.
Utilice el método Find de la clase BindingElementCollection para encontrar el elemento del enlace de seguridad.
Al utilizar el método Find, convierta al tipo real. El ejemplo siguiente convierte al tipo SymmetricSecurityBindingElement.
Establezca la propiedad MaxClockSkew en el elemento del enlace de seguridad.
Cree un ServiceHost con un tipo de servicio y dirección base adecuados.
Utilice el método AddServiceEndpoint para agregar un extremo e incluir el 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 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("https://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("https://localhost:1011/metadata/") Dim sm As New ServiceMetadataBehavior() sm.HttpGetEnabled = True sm.HttpGetUrl = mex sh.Description.Behaviors.Add(sm) End Sub
// 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("https://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(@"https://localhost:1001/metadata/"); ServiceMetadataBehavior sm = new ServiceMetadataBehavior(); sm.HttpGetEnabled = true; sm.HttpGetUrl = mex; sh.Description.Behaviors.Add(sm); }
Para establecer MaxClockSkew en la configuración
Cree un customBinding Element en la sección del elemento <Bindings>.
Cree un elemento <binding>name y establezca el atributo en un valor adecuado. El siguiente ejemplo lo define en
MaxClockSkewBinding
.Agregue un elemento de codificación. El siguiente ejemplo agrega un textMessageEncoding element.
Agregue un security Element of customBinding y establezca el atributo authenticationMode en un valor adecuado. El siguiente ejemplo establece el atributo en Kerberos para especificar que el servicio usa autenticación de Windows.
Agregue un localServiceSettings element y establezca el atributo maxClockSkew en un valor en la forma de "##:##:##". El siguiente ejemplo lo establece en 7 minutos. De manera opcional, agregue un localServiceSettings element y establezca el atributo maxClockSkew en un valor adecuado.
Agregue un elemento de transporte. El ejemplo siguiente utiliza un httpTransport element.
Para una conversación segura, la configuración de seguridad se debe producir en la programación previa del 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>
Vea también
Referencia
LocalClientSecuritySettings
LocalServiceSecuritySettings
CustomBinding
Conceptos
Cómo: Crear un enlace personalizado mediante SecurityBindingElement