Comparteix a través de


Procedimiento para bloquear puntos de conexión en la empresa

Las grandes empresas requieren a menudo que las aplicaciones se desarrollen conforme a las directivas de seguridad de la empresa. El tema siguiente trata sobre cómo desarrollar e instalar un validador de punto de conexión de cliente que se puede utilizar para validar todas las aplicaciones cliente de Windows Communication Foundation (WCF) instaladas en los equipos.

En este caso, el validador es un validador de cliente porque este comportamiento del punto de conexión se agrega a la sección <commonBehaviors> del cliente en el archivo machine.config. WCF carga comportamientos de extremo comunes solo para las aplicaciones cliente y carga los comportamientos de servicio comunes solo para las aplicaciones de servicio. Para instalar el mismo validador para las aplicaciones servicio, el validador debe ser un comportamiento de servicio. Para obtener más información, consulte la sección <commonBehaviors>.

Importante

Los comportamientos de los servicios o puntos de conexión que no están marcados con el atributo AllowPartiallyTrustedCallersAttribute (APTCA) y que se agregan a la sección <commonBehaviors> de un archivo de configuración no se ejecutan cuando la aplicación se ejecuta en un entorno de confianza parcial y no se inicia ninguna excepción cuando esto ocurre. Para forzar la ejecución de los comportamientos habituales, como los validadores, es necesario:

  • Marcar el comportamiento habitual con el atributo AllowPartiallyTrustedCallersAttribute de modo que pueda ejecutarse cuando se implementa como una aplicación de confianza parcial. Tenga en cuenta que puede establecerse una entrada de registro en el equipo para evitar que se ejecuten los ensamblados marcados con APTCA.

  • Asegurarse de implementar la aplicación como una aplicación de confianza total en la que los usuarios no pueden modificar los valores de la seguridad de acceso del código para ejecutar la aplicación en un entorno de confianza parcial. De poder hacerlo, el validador personalizado no se ejecutaría y no se iniciaría ninguna excepción. Para conocer una forma de garantizar esto, vea la opción levelfinal mediante la Herramienta de la directiva de seguridad de acceso del código (Caspol.exe).

Para más información, consulte Procedimientos recomendados de confianza parcial y Escenarios de implementación admitidos.

Para crear el validador de punto de conexión

  1. Cree un IEndpointBehavior con los pasos de validación que desee en el método Validate. En el código siguiente se muestra un ejemplo. (InternetClientValidatorBehavior se toma del ejemplo Validación de seguridad).

    public class InternetClientValidatorBehavior : IEndpointBehavior
    {
        public void AddBindingParameters(ServiceEndpoint serviceEndpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) { }
        public void ApplyClientBehavior(ServiceEndpoint serviceEndpoint, System.ServiceModel.Dispatcher.ClientRuntime behavior) { }
        public void ApplyDispatchBehavior(ServiceEndpoint serviceEndpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher) { }
    
        public void Validate(ServiceEndpoint endpoint)
        {
            BindingElementCollection elements = endpoint.Binding.CreateBindingElements();
    
            if (EndpointIsDual(endpoint, elements))
                throw new InvalidOperationException("InternetClientValidator: endpoint uses 'dual' mode. This mode is disallowed for use with untrusted services.");
    
            if (EndpointAllowsNtlm(endpoint, elements))
                throw new InvalidOperationException("InternetClientValidator: endpoint allows NTLM. This mode is disallowed for use with untrusted services.");
    
            if (EndpointAllowsTransactionFlow(endpoint, elements))
                throw new InvalidOperationException("InternetClientValidator: endpoint flows transaction ids. This mode is disallowed for use with untrusted services.");
        }
    
  2. Cree un nuevo BehaviorExtensionElement que registre el validador de punto de conexión creado en el paso 1. El ejemplo de código siguiente muestra cómo hacerlo. (El código original de este ejemplo está en el ejemplo Validación de seguridad).

    public class InternetClientValidatorElement : BehaviorExtensionElement
    {
        public override Type BehaviorType
        {
            get { return typeof(InternetClientValidatorBehavior); }
        }
    
        protected override object CreateBehavior()
        {
            return new InternetClientValidatorBehavior();
        }
    }
    
  3. Asegúrese de que el ensamblado compilado se firma con un nombre seguro. Para obtener detalles, consulte Sn.exe (Herramienta de nombre seguro) y los comandos de compilador para su lenguaje.

Para instalar el validador en el equipo de destino

  1. Instale el validador del punto de conexión mediante el mecanismo adecuado. En una empresa, esto puede hacerse utilizando la directiva de grupo y Systems Management Server (SMS).

  2. Instalar un ensamblado con nombre seguro en la memoria caché global de ensamblados usando Gacutil.exe (herramienta Caché global de ensamblados).

  3. Utilice los tipos de espacio de nombres de System.Configuration para:

    1. Agregue la extensión a la sección <behaviorExtensions> mediante un nombre de tipo completo y bloquee el elemento.

      // Register our validator configuration element.
      ExtensionsSection extensions
        = machine.GetSection(@"system.serviceModel/extensions") as ExtensionsSection;
      if (extensions == null)
        throw new Exception("not extensions section.");
      ExtensionElement validator
        = new ExtensionElement(
          "internetClientValidator",
          "Microsoft.ServiceModel.Samples.InternetClientValidatorElement, InternetClientValidator, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
        );
      validator.LockItem = true;
      if (extensions.BehaviorExtensions.IndexOf(validator) < 0)
        extensions.BehaviorExtensions.Add(validator);
      
    2. Agregue el elemento de comportamiento a la propiedad EndpointBehaviors de la sección <commonBehaviors> y bloquee el elemento. (Para instalar el validador en el servicio, el validador debe ser IServiceBehavior y debe agregarse a la propiedad ServiceBehaviors). En el ejemplo de código siguiente se muestra la configuración adecuada después de los pasos a. y b., con la única excepción de que no hay ningún nombre seguro.

      // Add a new section for our validator and lock it down.
      // Behaviors for client applications must be endpoint behaviors.
      // Behaviors for service applications must be service behaviors.
      CommonBehaviorsSection commonBehaviors
        = machine.GetSection(@"system.serviceModel/commonBehaviors") as CommonBehaviorsSection;
      InternetClientValidatorElement internetValidator = new InternetClientValidatorElement();
      internetValidator.LockItem = true;
      commonBehaviors.EndpointBehaviors.Add(internetValidator);
      
    3. Guarde el archivo machine.config. El ejemplo de código siguiente realiza todas las tareas en el paso 3 pero guarda localmente una copia del archivo machine.config modificado.

      // Write to disk.
      machine.SaveAs("newMachine.config");
      
      // Write our new information.
      SectionInformation cBInfo = commonBehaviors.SectionInformation;
      Console.WriteLine(cBInfo.GetRawXml());
      Console.WriteLine(extensions.SectionInformation.GetRawXml());
      Console.Read();
      

Ejemplo

El ejemplo de código siguiente muestra cómo agregar un comportamiento común al archivo machine.config y guardar una copia en el disco. InternetClientValidatorBehavior se toma del ejemplo Validación de seguridad.

Configuration machine = ConfigurationManager.OpenMachineConfiguration();
// Register our validator configuration element.
ExtensionsSection extensions
  = machine.GetSection(@"system.serviceModel/extensions") as ExtensionsSection;
if (extensions == null)
  throw new Exception("not extensions section.");
ExtensionElement validator
  = new ExtensionElement(
    "internetClientValidator",
    "Microsoft.ServiceModel.Samples.InternetClientValidatorElement, InternetClientValidator, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
  );
validator.LockItem = true;
if (extensions.BehaviorExtensions.IndexOf(validator) < 0)
  extensions.BehaviorExtensions.Add(validator);

// Add a new section for our validator and lock it down.
// Behaviors for client applications must be endpoint behaviors.
// Behaviors for service applications must be service behaviors.
CommonBehaviorsSection commonBehaviors
  = machine.GetSection(@"system.serviceModel/commonBehaviors") as CommonBehaviorsSection;
InternetClientValidatorElement internetValidator = new InternetClientValidatorElement();
internetValidator.LockItem = true;
commonBehaviors.EndpointBehaviors.Add(internetValidator);
// Write to disk.
machine.SaveAs("newMachine.config");

// Write our new information.
SectionInformation cBInfo = commonBehaviors.SectionInformation;
Console.WriteLine(cBInfo.GetRawXml());
Console.WriteLine(extensions.SectionInformation.GetRawXml());
Console.Read();

Seguridad de .NET Framework

También puede querer cifrar los elementos del archivo de configuración. Para obtener más información, vea la sección Vea también.

Consulte también