对象已存在于RSACryptoServiceProvider中

时间:2011-01-21 20:45:23

标签: c# encryption cryptography rsacryptoserviceprovider

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

是什么阻止我的新应用程序读取保存在其他应用程序中的密钥?所有其他事情都是相同的,记录在用户帐户等。

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

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

4 个答案:

答案 0 :(得分:7)

您是否尝试向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

答案 1 :(得分:6)

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

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 :(得分:2)

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

答案 3 :(得分:0)

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

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

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