私は最近、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);