Объект уже существует в RSACryptoServiceProvider - PullRequest
9 голосов
/ 21 января 2011

Я скопировал исходный код из одного приложения в другое, оба работают на одной машине.Я также использую одну и ту же строку для containerName ниже в обоих приложениях.

Что мешает моему новому приложению прочитать ключ, который был сохранен в другом приложении?Все остальные вещи равны, залогинены в учетной записи пользователя и т. Д.

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

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

Ответы [ 4 ]

7 голосов
/ 22 января 2011

Вы пытались предоставить разрешения «Все», например, для файлов в «Документы и настройки \ Все пользователи \ Данные приложения \ Microsoft \ Crypto \ RSA \ Machine Keys», как там описано:

http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/f7b9f928-a794-47f2-a5bd-9f64ca375040

6 голосов
/ 02 сентября 2011

Другое решение - установить доступ для всех по коду:

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);
2 голосов
/ 01 марта 2011

Я столкнулся с этой проблемой, потому что у моей службы WCF не было разрешения на доступ к хранилищу ключей.Я справился с проблемой, следуя инструкциям по предоставлению пользователю доступа на чтение ASPNET, который я нашел здесь: http://msdn.microsoft.com/en-us/library/2w117ede.aspx#Y898

0 голосов
/ 09 сентября 2014

Недавно я столкнулся с этой проблемой с несколькими развернутыми сайтами IIS на одном сервере (Windows 2008 R2). В нашей среде каждый сайт работает в разных пулах приложений, но в некоторых случаях этим пулам может быть присвоен один и тот же идентификатор.

Наше приложение создает ключ, если он не существует, и помещает его в контейнер с именем на основе текущего идентификатора. Первый развернутый сайт всегда работал, но если мы развернем другой сайт в другом пуле приложений с таким же идентификатором, второй не получится.

Оказывается, что при сохранении ключа Windows предоставляет полный доступ пользователю "IIS APPPOOL \ AppPoolName", а не идентификатору, который мы присвоили пулу.

Итак, наше решение состояло в том, чтобы дать контейнеру явные разрешения на текущую идентификацию (это похоже на ответ @ Webmixer, единственное отличие заключается в CryptoKeyAccessRule):

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(System.Security.Principal.WindowsIdentity.GetCurrent(), CryptoKeyRights.FullControl, AccessControlType.Allow);

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