2010-03-11 3 views
2

J'utilise .NET 3.5. Dites que j'ai une méthode qui accède à un fichier spécifique, et une clé de registre spécifique. Je souhaite ajouter des définitions de sécurité déclaratives qui limitent la méthode afin qu'elle puisse uniquement accéder au fichier et à la clé de registre spécifiés, et rien d'autre.Sécurité déclarative sur les méthodes dans .NET 3.5 - comment verrouiller les permissions d'une méthode?

Lorsque je tente:

[RegistryPermission(SecurityAction.PermitOnly, Read = "registry key path"] 
    [FileIOPermission(SecurityAction.PermitOnly, Read = "file path")] 

... il me permet de lire le chemin du fichier, mais pas la clé de Registre - je reçois une exception de sécurité.

Si j'utilise:

[RegistryPermission(SecurityAction.Demand, Read = "registry key path"] 
    [FileIOPermission(SecurityAction.Demand, Read = "file path")] 

... il me permet de lire le fichier et la clé de Registre, mais me permet aussi accéder à d'autres fichiers. Ai-je manqué quelque chose sur la façon dont ces méthodes devraient être utilisées pour obtenir cet effet?

Edit:

Le code que je utilise pour accéder à la clé de Registre est:

RegistryKey rk = Registry.LocalMachine; 
    rk = rk.OpenSubKey("MyKey"); 
    string registryVal = rk.GetValue("Test").ToString(); 

et donc la déclaration d'autorisation est:

[RegistryPermission(SecurityAction.PermitOnly, Read = @"HKEY_LOCAL_MACHINE\MyKey")] 

Merci.

+0

Si votre application/AppDomain fonctionne en toute confiance, ces attributs ne feront rien. Courez-vous en confiance partielle? – Steven

+0

Eh bien, il échoue définitivement si j'essaie d'accéder à un fichier qui n'est pas répertorié dans les attributs lors de l'utilisation de PermitOnly. –

Répondre

1

Je pense que ce que SecurityAction.Demand fait est de jeter une exception de sécurité si votre chaîne d'appel actuelle n'a pas déjà l'accès spécifié. Il ne change pas l'accès que vous avez (donc il ne limiterait pas les autres fichiers auxquels vous pouvez écrire), mais vous devriez voir une exception de sécurité si vous n'avez pas accès au chemin spécifié. À partir de ce que vous spécifiez, PermitOnly est la valeur correcte à utiliser (elle limite l'accès à l'élément que vous spécifiez), et je me demande si le code de votre clé de registre est où le problème est. Un exemple typique est que les classes de registre .NET peuvent être utilisées pour ouvrir une clé en "lecture seule" ou en "lecture-écriture" - et si vous essayez d'ouvrir en lecture-écriture, vous obtiendrez une exception de sécurité même si vous N'essayez jamais de changer la valeur. Pouvez-vous poster le code à votre accès au registre?

+0

Édité ma question pour inclure le code d'accès au registre, merci :) –

+0

Sur quelle ligne se plante-t-il? Le 'OpenSubKey' ou le' GetValue'? –

+0

OpenSubKey. Hmm, peut-être qu'il a aussi besoin d'autorisations explicites pour Registry.LocalMachine –

Questions connexes