10

ソースコードをあるアプリケーションから別のアプリケーションにコピーしました。どちらも同じマシンで実行されています。また、両方のアプリケーションで、以下のcontainerNameに同じ文字列を使用しています。

新しいアプリケーションが他のアプリケーションに保存されたキーを読み取れない原因は何ですか?他のすべてのものは等しく、ログインしているユーザーアカウントなどです。

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

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

4 に答える 4

7

たとえば、「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

于 2011-01-21T22:07:09.470 に答える
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);
于 2011-09-02T12:38:55.080 に答える
1

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

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

キーが格納されると、Windows はユーザー "IIS APPPOOL\AppPoolName" に完全なアクセス権を付与しますが、プールに割り当てた ID には付与しません。

したがって、私たちの解決策は、コンテナーに現在の ID への明示的なアクセス許可を与えることでした (これは @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);
于 2014-09-09T16:58:59.440 に答える