Procedura: bloccare gli endpoint nell'organizzazione
Le aziende di grandi dimensioni spesso richiedono che le applicazioni vengano sviluppate in conformità con i criteri di sicurezza aziendali. Nell'argomento seguente viene illustrato come installare e sviluppare un validator dell'endpoint client che può essere usato per convalidare tutte le applicazioni client di Windows Communication Foundation (WCF) installate nei computer.
In questo caso, il validator è un validator client perché questo comportamento dell'endpoint viene aggiunto alla sezione <commonBehaviors> del client nel file machine.config. In WCF vengono caricati i comportamenti dell'endpoint comuni solo per le applicazioni client e i comportamenti del servizio comuni solo per le applicazioni di servizio. Per installare questo stesso validator per le applicazioni di servizio, il validator deve essere un comportamento del servizio. Per altre informazioni, vedere la sezione <commonBehaviors>.
Importante
I comportamenti del servizio o dell'endpoint non contrassegnati con l'attributo AllowPartiallyTrustedCallersAttribute (APTCA) aggiunti alla sezione <commonBehaviors> di un file di configurazione non vengono eseguiti se l'applicazione è in esecuzione in un ambiente parzialmente attendibile. In tali circostanze non viene generata alcuna eccezione. Per imporre l'esecuzione di comportamenti comuni, ad esempio validator, è necessario:
Contrassegnare il proprio comportamento comune con l'attributo AllowPartiallyTrustedCallersAttribute in modo tale che questo possa essere eseguito se distribuito come applicazione parzialmente attendibile. Si noti che è possibile impostare nel computer una voce di registro per impedire l'esecuzione degli assembly APTCA.
Verificare che, se l'applicazione viene distribuita come completamente attendibile, gli utenti non possano modificare le impostazioni di sicurezza per l'accesso al codice per eseguire l'applicazione in ambiente parzialmente attendibile. In tal caso, il validator personalizzato non viene eseguito e non viene generata alcuna eccezione. Per verificare tali circostanze, vedere l'opzione
levelfinal
con lo strumento Code Access Security Policy (Caspol.exe).
Per altre informazioni, vedere Procedure consigliate in ambienti parzialmente attendibili e Scenari di distribuzione supportati.
Creazione del validator dell'endpoint.
Creare un oggetto IEndpointBehavior con i passaggi di convalida desiderati nel metodo Validate. Il codice seguente fornisce un esempio.
InternetClientValidatorBehavior
è tratto dall'esempio Convalida della sicurezza.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."); }
Creare un nuovo oggetto BehaviorExtensionElement che registra il validator dell'endpoint creato nel passaggio 1. Nell'esempio di codice seguente viene illustrata questa operazione. Il codice originale per questo esempio è disponibile nell'esempio Convalida della sicurezza.
public class InternetClientValidatorElement : BehaviorExtensionElement { public override Type BehaviorType { get { return typeof(InternetClientValidatorBehavior); } } protected override object CreateBehavior() { return new InternetClientValidatorBehavior(); } }
Verificare che l'assembly compilato sia firmato con un nome sicuro. Per informazioni dettagliate, vedere la pagina relativa allo strumento Strong Name (SN.EXE) e i comandi del compilatore per il linguaggio usato.
Installazione del validator nel computer di destinazione
Installare il validator dell'endpoint utilizzando il meccanismo appropriato. In un'azienda, è possibile usare a tale fine Criteri di gruppo e Systems Management Server (SMS).
Installare un assembly con nome sicuro nella Global Assembly Cache mediante lo strumento Gacutil.exe (strumento Global Assembly Cache).
Usare i tipi di spazio dei nomi System.Configuration per:
Aggiungere l'estensione alla sezione <behaviorExtensions> usando un nome completo e bloccare l'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);
Aggiungere l'elemento di comportamento alla proprietà
EndpointBehaviors
della sezione <commonBehaviors> e bloccare l'elemento. Per installare un validator nel servizio, tale validator deve essere un IServiceBehavior e deve essere aggiunto alla proprietàServiceBehaviors
. Nell'esempio di codice seguente viene illustrata la configurazione corretta dopo i passaggi a. e b., con la sola eccezione che non è presente un nome sicuro.// 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);
Salvare il file machine.config. Nell'esempio di codice seguente vengono eseguite tutte le attività nel passaggio 3, ma viene salvata localmente una copia del file machine.config modificato.
// 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();
Esempio
Nell'esempio di codice seguente viene illustrato come aggiungere un comportamento comune al file machine.config e salvare una copia sul disco. InternetClientValidatorBehavior
è tratto dall'esempio Convalida della sicurezza.
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();
Sicurezza di .NET Framework
Si potrebbe inoltre desiderare di crittografare gli elementi del file di configurazione. Per altre informazioni, vedere la sezione Vedere anche.