Como: bloquear pontos de extremidade na empresa
Em geral, as grandes empresas exigem que os aplicativos sejam desenvolvidos em conformidade com as políticas de segurança da empresa. O tópico a seguir discute como desenvolver e instalar um validador de ponto de extremidade do cliente que pode ser usado para validar todos os aplicativos cliente do WCF (Windows Communication Foundation) instalados nos computadores.
Nesse caso, o validador é um validador do cliente, porque esse comportamento de ponto de extremidade é adicionado à seção <commonBehaviors> do cliente no arquivo machine.config. O WCF carrega os comportamentos comuns de ponto de extremidade apenas para os aplicativos cliente e carrega os comportamentos de serviço comuns apenas para os aplicativos de serviço. Para instalação desse mesmo validador para os aplicativos de serviço, o validador precisa ser um comportamento de serviço. Para obter mais informações, confira a seção <commonBehaviors>.
Importante
Os comportamentos de serviço ou de ponto de extremidade não marcados com o atributo AllowPartiallyTrustedCallersAttribute (APTCA) que são adicionados à seção <commonBehaviors> de um arquivo de configuração não são executados quando o aplicativo é executado em um ambiente de confiança parcial, e nenhuma exceção é gerada quando isso ocorre. Para impor a execução de comportamentos comuns, como validadores, você precisa:
Marcar o comportamento comum com o atributo AllowPartiallyTrustedCallersAttribute para que ele possa ser executado quando implantado como um aplicativo de Confiança Parcial. Observar que uma entrada do Registro pode ser definida no computador para impedir que os assemblies marcados com APTCA sejam executados.
Verificar se o aplicativo foi implantado como um aplicativo totalmente confiável do qual os usuários não podem modificar as configurações de segurança de acesso do código para executá-lo em um ambiente de Confiança Parcial. Se eles puderem fazer isso, o validador personalizado não será executado e nenhuma exceção será gerada. Para ver uma forma de garantir isso, confira a opção
levelfinal
usando a Ferramenta de Política de Segurança de Acesso do Código (Caspol.exe).
Para obter mais informações, confira Melhores práticas da Confiança Parcial e Cenários de implantação com suporte.
Para criar o validador de ponto de extremidade
Crie um IEndpointBehavior com as etapas de validação desejadas no método Validate. O código a seguir fornece um exemplo. (A
InternetClientValidatorBehavior
foi obtida do exemplo de Validação de segurança.)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."); }
Crie um BehaviorExtensionElement que registre o validador de ponto de extremidade criado na etapa 1. O exemplo de código a seguir mostra isso. (O código original deste exemplo está no exemplo Validação de segurança.)
public class InternetClientValidatorElement : BehaviorExtensionElement { public override Type BehaviorType { get { return typeof(InternetClientValidatorBehavior); } } protected override object CreateBehavior() { return new InternetClientValidatorBehavior(); } }
Verifique se o assembly compilado está assinado com um nome forte. Para ver detalhes, confira a Ferramenta de Nome Forte (SN.EXE) e os comandos do compilador para sua linguagem.
Para instalar o validador no computador de destino
Instale o validador de ponto de extremidade usando o mecanismo apropriado. Em uma empresa, isso pode ser feito usando a Política de Grupo e o SMS (Servidor de Gerenciamento de Sistemas).
Instale o assembly fortemente nomeado no cache de assembly global usando o Gacutil.exe (Ferramenta de Cache de Assembly Global).
Use os tipos de namespace System.Configuration para:
Adicione a extensão à seção <behaviorExtensions> usando um nome de tipo totalmente qualificado e bloqueie o 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);
Adicione o elemento de comportamento à propriedade
EndpointBehaviors
da seção <commonBehaviors> e bloqueie o elemento. (Para instalar o validador no serviço, o validador precisa ser um IServiceBehavior e ser adicionado à propriedadeServiceBehaviors
). O exemplo de código a seguir mostra a configuração correta após as etapas a. e b., com a única exceção de que não há nenhum nome forte.// 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);
Salve o arquivo machine.config. O exemplo de código a seguir executa todas as tarefas da etapa 3, mas salva uma cópia do arquivo machine.config modificado localmente.
// 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();
Exemplo
O exemplo de código a seguir mostra como adicionar um comportamento comum ao arquivo machine.config e salvar uma cópia no disco. A InternetClientValidatorBehavior
foi obtida do exemplo de Validação de segurança.
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();
Segurança do .NET Framework
O ideal é também criptografar os elementos do arquivo de configuração. Para obter mais informações, veja a seção Confira também.