10
votes

Objet existe déjà dans RsacryptoServiceProvider

J'ai copié le code source d'une application à une autre, les deux fonctionnant sur la même machine. J'utilise également la même chaîne pour ConteneName ci-dessous dans les deux applications.

Qu'est-ce qui empêche ma nouvelle application de lire la clé qui a été enregistrée dans l'autre application? Toutes les autres choses sont égales, Compte utilisateur connecté, etc. P>

     CspParameters cspParams = new CspParameters();
     cspParams.KeyContainerName = containerName;
     cspParams.Flags = CspProviderFlags.UseMachineKeyStore;

     // Get error "object already exists" below.
     RSACryptoServiceProvider  rsaKey = new RSACryptoServiceProvider(cspParams);


0 commentaires

4 Réponses :


7
votes

Avez-vous essayé d'accorder des autorisations à tout le monde, par exemple, pour les fichiers dans "Documents et paramètres \ Tous les utilisateurs \ Data de l'application \ Microsoft \ Crypto \ RSA \ Machines", comme décrit ici:

http: // sociale. msdn.microsoft.com/forums/fr/netfxbcl/thread/f7b9f928-A794-47F2-A5BD-9F64CA375040


2 commentaires

Peut ne pas s'appliquer car je gère le même code dans deux projets différents, mais sous le même compte d'utilisateur.


Est-ce que l'emplacement de Windows XP? "C: \ PROGRAMDATA \ Microsoft \ Crypto \ RSA \ MachinesKeys" est le lieu Vista (et Up) que je pense.



2
votes

J'ai rencontré ce problème car mon service WCF n'avait pas la permission d'accéder au magasin de clés. J'ai passé le problème au problème en suivant les instructions pour accorder à l'utilisateur ASPnet Lire l'accès que j'ai trouvé ici: http://msdn.microsoft.com/en-us/library/2w1170de.aspx#y898


0 commentaires

6
votes

Une autre solution consiste à définir l'accès à tous par code:

CspParameters cspParams;
cspParams = new CspParameters(PROVIDER_RSA_FULL);
cspParams.KeyContainerName = CONTAINER_NAME;
cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
cspParams.ProviderName = "Microsoft Strong Cryptographic Provider";

CryptoKeyAccessRule rule = new CryptoKeyAccessRule("everyone", CryptoKeyRights.FullControl, AccessControlType.Allow);

cspParams.CryptoKeySecurity = new CryptoKeySecurity();
cspParams.CryptoKeySecurity.SetAccessRule(rule);


3 commentaires

Il suffit de courir dans ce problème. Utilisation du service CommandLine aspnet_regiis -pa "Sampleeys" "Service NT Authority \ Network" n'a pas fonctionné, mais votre solution a fait le travail. Merci beaucoup!


Au lieu de "tout le monde", je devais passer nouveau SecurityIdentifier (wellknownSidType.worldsid, null) . Je suppose que cela n'a pas fonctionné car "tout le monde" l'utilisateur est localisé dans ma langue sur ma machine.


Tout comme FYI à quiconque en trouvant cela, utiliser cryptokeyaccessrule , vous devez faire à l'aide de system.security.accesscontrol et pour nouveau SecurityIdentifier et < Code> BienknownSidType , c'est à l'aide de System.Security.Principal . VS 2015 est utile de suggérer des corrections pour les espaces de noms, mais quiconque utilise une version avant cela, qui pourrait ne pas savoir si bien les espaces de noms, pourrait avoir du mal à déterminer quoi importer. Dites-nous vos assemblées lorsque vous importerez des choses en dehors de la valeur par défaut !!!



1
votes

J'ai récemment couru dans ce numéro avec plusieurs sites IIS déployés sur un serveur unique (Windows 2008 R2). Notre environnement dispose de chaque site sur différents pools d'applications, mais dans certains cas, ces pools peuvent être attribués la même identité.

Notre application crée une clé si l'on n'existe pas et la place dans un conteneur avec un nom basé sur l'identité actuelle. Le premier site déployé a toujours fonctionné, mais si nous avons déployé un autre site dans un autre pool d'applications avec la même identité, le second échouerait.

s'avère que lorsque la clé est stockée, Windows donne un accès complet à l'utilisateur. "IIS AppPool \ Apppoolname", et pas l'identité que nous avons assignée à la piscine.

Donc, notre solution était de donner aux autorisations explicites du conteneur à l'identité actuelle (ceci est similaire à la réponse de @ WebMixer, La seule différence est dans le cryptokeyaccessrule ): xxx


3 commentaires

J'ai ne peut pas convertir de 'system.security.prinipal.windowssidité' à 'System.Security.Principal.IdentifyReference' Quand j'ai essayé d'insérer ceci, comme écrit. Peut-être besoin Nouveau SecurityIdentifier (System.Security.Prinipal.WindowSsidentialité .getCurrent (). Tostri ng ()) ?


Pas certain. Je suppose que quelque chose aurait pu changer au cours des deux dernières années. Nous avons retiré le code ci-dessus il y a quelque temps.


Essayé, il compile, mais a obtenu une erreur system.argumentException: la valeur était invalide , de sorte que cela ne l'aime pas. Je ne pense pas que ce soit la syntaxe, mais j'ai eu la même chose à l'aide de la suggestion de Tom sur la réponse de WebMixer ( Nouveau SecurityIdentifier (WellknownSidType.worldsid, Null) ). Si j'utilisais directement la réponse de WebMixer, utiliser "tout le monde" , j'ai cryptographicexception: objet existe déjà .