Я недавно столкнулся с этим вопросом с несколькими развернутыми сайтами 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);
Может не применять, так как я запуск того же кода в двух разных проектах, но под одной и той же учетной записью пользователя. – LamonteCristo
Является ли это местом Windows XP? «C: \ ProgramData \ Microsoft \ Crypto \ RSA \ MachineKeys» - это место Vista (и выше), которое я думаю. – granadaCoder