Недавно я столкнулся с этой проблемой с несколькими развернутыми сайтами IIS на одном сервере (Windows 2008 R2). В нашей среде каждый сайт работает в разных пулах приложений, но в некоторых случаях этим пулам может быть присвоен один и тот же идентификатор.
Наше приложение создает ключ, если он не существует, и помещает его в контейнер с именем на основе текущего идентификатора. Первый развернутый сайт всегда работал, но если мы развернем другой сайт в другом пуле приложений с таким же идентификатором, второй не получится.
Оказывается, что при сохранении ключа 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);