Segurança de propriedade da dependênciaDependency Property Security

As propriedades da dependência geralmente devem ser consideradas como propriedades públicas.Dependency properties should generally be considered to be public properties. A natureza do sistema de propriedades Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) impede que a capacidade de dar garantias de segurança sobre um valor da propriedade de dependência.The nature of the Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) property system prevents the ability to make security guarantees about a dependency property value.

Acesso e segurança de Wrappers e propriedades de dependênciaAccess and Security of Wrappers and Dependency Properties

Normalmente, as propriedades de dependência são implementadas junto com propriedades CLR (Common Language Runtime)common language runtime (CLR) de "wrapper" que simplificam obter e configurar a propriedade de uma instância.Typically, dependency properties are implemented along with "wrapper" CLR (Common Language Runtime)common language runtime (CLR) properties that simplify getting or setting the property from an instance. Mas os wrappers são métodos realmente convenientes que implementam subjacente GetValue e SetValue chamadas estáticas que são usadas ao interagir com propriedades de dependência.But the wrappers are really just convenience methods that implement the underlying GetValue and SetValue static calls that are used when interacting with dependency properties. Pensando nisso de outra forma, as propriedades são expostas como propriedades CLR (Common Language Runtime)common language runtime (CLR) que têm o respaldo de uma propriedade de dependência, em vez de um campo particular.Thinking of it in another way, the properties are exposed as CLR (Common Language Runtime)common language runtime (CLR) properties that happen to be backed by a dependency property rather than by a private field. Mecanismos de segurança aplicados aos wrappers não são paralelo ao comportamento do sistema de propriedade e acesso da propriedade de dependência subjacente.Security mechanisms applied to the wrappers do not parallel the property system behavior and access of the underlying dependency property. Colocar uma exigência de segurança em um wrapper só irá prevenir o uso do método conveniente mas não irá prevenir chamadas para GetValue ou SetValue.Placing a security demand on the wrapper will only prevent the usage of the convenience method but will not prevent calls to GetValue or SetValue. Da mesma forma, impor um nível de acesso protegido ou privado aos wrappers não oferece nenhuma segurança efetiva.Similarly, placing protected or private access level on the wrappers does not provide any effective security.

Se você estiver escrevendo suas próprias propriedades de dependência, você deve declarar os wrappers e o DependencyProperty identificador de campo como membros públicos, para que os chamadores não obter falsos informações sobre o nível de acesso de propriedade (devido ao seu repositório está sendo implementado como uma propriedade de dependência).If you are writing your own dependency properties, you should declare the wrappers and the DependencyProperty identifier field as public members, so that callers do not get misleading information about the true access level of that property (because of its store being implemented as a dependency property).

Para uma propriedade de dependência personalizada, você pode registrar sua propriedade como uma propriedade de dependência somente leitura, e isso fornece um meio eficaz de impedir que uma propriedade sendo definida por qualquer pessoa que não possui uma referência para o DependencyPropertyKey para essa propriedade.For a custom dependency property, you can register your property as a read-only dependency property, and this does provide an effective means of preventing a property being set by anyone that does not hold a reference to the DependencyPropertyKey for that property. Para obter mais informações, consulte Propriedades de dependência somente leitura.For more information, see Read-Only Dependency Properties.

Observação

Declarando um DependencyProperty identificador campo privado não é proibido e perfeitamente pode ser usado para ajudar a reduzir o namespace exposto imediato de uma classe personalizada, mas essa propriedade não deve ser considerada "private" no mesmo sentido que a CLR (Common Language Runtime)common language runtime (CLR) definições de idioma definem o nível de acesso, por razões descritas na próxima seção.Declaring a DependencyProperty identifier field private is not forbidden, and it can conceivably be used to help reduce the immediately exposed namespace of a custom class, but such a property should not be considered "private" in the same sense as the CLR (Common Language Runtime)common language runtime (CLR) language definitions define that access level, for reasons described in the next section.

Exposição do sistema de propriedades das propriedades de dependênciaProperty System Exposure of Dependency Properties

Não é geralmente útil, e é potencialmente enganosa para declarar um DependencyProperty como qualquer nível de acesso diferente de público.It is not generally useful, and it is potentially misleading, to declare a DependencyProperty as any access level other than public. Essa configuração de nível de acesso só impede que alguém possa obter uma referência à instância da classe declarante.That access level setting only prevents someone from being able to get a reference to the instance from the declaring class. Mas há vários aspectos do sistema de propriedades que retornará um DependencyProperty como o modo de identificar uma propriedade específica, como ele existe em uma instância de uma classe ou uma instância de classe derivada, e este identificador é ainda pode ser usado em um SetValue chamar mesmo Se o identificador estático original é declarado como confidenciais.But there are several aspects of the property system that will return a DependencyProperty as the means of identifying a particular property as it exists on an instance of a class or a derived class instance, and this identifier is still usable in a SetValue call even if the original static identifier is declared as nonpublic. Além disso, OnPropertyChanged métodos virtuais recebem informações de qualquer propriedade de dependência existente que mudaram de valor.Also, OnPropertyChanged virtual methods receive information of any existing dependency property that changed value. Além disso, o GetLocalValueEnumerator método retorna identificadores para qualquer propriedade em instâncias com definidos localmente valor.In addition, the GetLocalValueEnumerator method returns identifiers for any property on instances with a locally set value.

Validação e segurançaValidation and Security

Aplicar uma demanda para um ValidateValueCallback e esperar a falha de validação em uma falha de demanda para impedir que uma propriedade sendo definida não é um mecanismo de segurança adequado.Applying a demand to a ValidateValueCallback and expecting the validation failure on a demand failure to prevent a property from being set is not an adequate security mechanism. Invalidação de valor definido aplicada por meio de ValidateValueCallback podem também ser suprimidos por chamadores mal-intencionados, se esses chamadores estão operando dentro do domínio de aplicativo.Set-value invalidation enforced through ValidateValueCallback could also be suppressed by malicious callers, if those callers are operating within the application domain.

Consulte tambémSee Also

Propriedades de dependência personalizadasCustom Dependency Properties