对象已存在于RSACryptoServiceProvider中

我将源代码从一个应用程序复制到另一个应用程序,两者都在同一台机器上运行。 我在两个应用程序中也使用下面的containerName相同的字符串。

是什么阻止我的新应用程序读取另一个应用程序中保存的密钥? 所有其他事情都是平等的,登录用户帐户等。

CspParameters cspParams = new CspParameters(); cspParams.KeyContainerName = containerName; cspParams.Flags = CspProviderFlags.UseMachineKeyStore; // Get error "object already exists" below. RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams); 

您是否尝试向Everyone授予权限,例如,对于“Documents and Settings \ All Users \ Application Data \ Microsoft \ Crypto \ RSA \ Machine Keys”中的文件,如下所述:

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

另一种解决方案是通过代码设置对每个人的访问:

 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); 

我遇到了这个问题,因为我的WCF服务没有访问密钥库的权限。 我按照说明授予用户ASPNET读取访问权限,我在这里找到了问题: http : //msdn.microsoft.com/en-us/library/2w117ede.aspx#Y898

我最近在单个服务器(Windows 2008 R2)上遇到了多个已部署的IIS站点。 我们的环境使每个站点在不同的应用程序池上运行,但在某些情况下,可以为这些池分配相同的标识。

我们的应用程序创建一个密钥(如果不存在),并将其放在一个名为基于当前标识的容器中。 第一个部署的站点始终有效,但如果我们将另一个站点部署到具有相同标识的另一个应用程序池中,则第二个站点将失败。

事实certificate,当存储密钥时,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);