Compartir a través de


Cómo bloquear extremos 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 extremo 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 clientes debido a que el comportamiento del extremo se agrega a la sección cliente del archivo <commonBehaviors>WCF carga los comportamientos de extremo habituales solo para las aplicaciones cliente, y carga los comportamientos de servicio habituales solo para las aplicaciones servicio. Para instalar el mismo validador para las aplicaciones servicio, el validador debe ser un comportamiento de servicio. Para obtener más información, vea la sección <commonBehaviors>.

Aa751866.Important(es-es,VS.100).gif Nota:
Los comportamientos de servicio o de extremo 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, sin que se inicie 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 al 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 consultar una manera de garantizarlo, vea la opción levelfinal mediante Code Access Security Policy Tool (Caspol.exe).

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

Para crear el validador de extremo

  1. Cree un IEndpointBehavior con los pasos de validación que desee en el método Validate. El siguiente código proporciona un ejemplo. (InternetClientValidatorBehavior viene 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 extremo creado en el paso 1. El ejemplo de código siguiente muestra cómo hacerlo. (El código original para 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 información detallada, vea Strong Name Tool (Sn.exe) y los comandos de compilador para su lenguaje.

Para instalar el validador en el equipo de destino

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

  2. Instale el ensamblado con nombre seguro en la caché global de ensamblados mediante Global Assembly Cache Tool (Gacutil.exe).

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

    1. Agregue la extensión a la sección <behaviorExtensions> utilizando 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 un IServiceBehavior que se agregue a la propiedad ServiceBehaviors.) El ejemplo de código siguiente muestra la configuración apropiada después de los pasos a. y b., con la única excepción de que no haya 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 viene de la muestra de 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

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.

Vea también

Otros recursos

Cifrar los elementos del archivo de configuración con DPAPI
Cifrar los elementos del archivo de configuración con RSA