2011-01-21 60 views
8

ソースコードをあるアプリケーションから別のアプリケーションにコピーしました。どちらも同じマシン上で実行されています。私は両方のアプリケーションで以下のcontainerNameにも同じ文字列を使用しています。オブジェクトが既にRSACryptoServiceProviderに存在しています

新しいアプリケーションが他のアプリケーションに保存されたキーを読み取ることを妨げる原因は何ですか?他のすべてのものは、同じである

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

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

答えて

7

ユーザーアカウントになどに記録されますが、アプリケーションデータ\マイクロソフト\暗号化\ RSA \すべてのユーザー\みんなに、例えば、「ドキュメントと設定内のファイルのアクセス権を付与しようとしました\マシンキー」、それはそこに述べたように:私のWCFサービスは、キーストアにアクセスする権限を持っていなかったので、

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

+0

適用されない場合があります:だから

、当社のソリューションは、現在のアイデンティティへの明示的な権限が(これは、唯一の違いはCryptoKeyAccessRuleにWebmixerの答え@に似ています)コンテナを与えることでした同じコードを2つの異なるプロジェクトで実行しますが、同じユーザーアカウントで実行します。 – LamonteCristo

+0

これはWindows XPの場所ですか? "C:¥ProgramData¥Microsoft¥Crypto¥RSA¥MachineKeys"は、私が思うVista(以上)の場所です。 – granadaCoder

5

別の解決策は、コードによってすべての人へのアクセスを設定することです:

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

この問題が発生しました。コマンドライン 'aspnet_regiis -pa"を使用すると、 "SampleKeys" "NT AUTHORITY \ NETWORK SERVICE"は動作しませんでしたが、あなたのソリューションはその仕事をしました。どうもありがとう! –

+1

"everyone"ではなく、新しいSecurityIdentifier(WellKnownSidType.WorldSid、null)を渡す必要がありました。私はそれがうまくいかなかったと思います。なぜなら、「誰も」のユーザーは自分のマシン上で自分の言語にローカライズされているからです。 – Tom

+2

「CryptoKeyAccessRule」を使用するには、これを見つけた方にも 'System.Security.AccessControl'を使用し、' new SecurityIdentifier'と 'WellKnownSidType'には' System.Security.Principal'を使用する必要があります。 VS 2015は名前空間の修正を提案するのには良いことですが、その前にバージョンを使用している人は、名前空間をあまりよく知らないかもしれません。デフォルト以外のものをインポートするときは、アセンブリを教えてください!!! – vapcguy

0

私は最近、この問題に遭遇しました1つのサーバー(Windows 2008 R2)に複数のIISサイトを展開します。私たちの環境では、各サイトが異なるアプリケーションプールで動作していますが、場合によっては、それらのプールに同じIDを割り当てることができます。

私たちのアプリケーションはキーが存在しない場合はキーを作成し、現在のアイデンティティに基づいた名前のコンテナに配置します。最初に展開されたサイトは常に機能しましたが、別のサイトを同じIDを持つ別のアプリケーションプールに展開した場合、2番目のサイトは失敗します。

キーが保存されると、Windowsはプールに割り当てたIDではなく、ユーザー "IIS APPPOOL \ AppPoolName"にフルアクセスできます。私は以来、

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

「System.Security.Principal.WindowsIdentity」から「System.Security.Principal.IdentityReference」に変換することはできません。たぶん '新しいSecurityIdentifier(System.Security.Principal.WindowsIdentity.GetCurrent()。ToString())'が必要ですか? – vapcguy

+0

わかりません。私は何年か前に何か変わったかもしれないと思う。私たちはしばらく前にコードを引退しました。 –

+0

試してみましたが、コンパイルされましたが、エラー 'System。ArgumentException:Value was invalid 'なので、好きではありませんでした。私はそれが構文だとは思わないが、Webmixerの答えにTomの提案( 'new SecurityIdentifier(WellKnownSidType.WorldSid、null)')を使って同じことがある。私がWebmixerの答えを直接使用した場合、 '' everyone ''を使うために、私は' CryptographicException:Object already exists'を取得します。 – vapcguy

関連する問題