Niedawno prowadził w tej kwestii z wieloma wdrożonymi witrynami IIS na jednym serwerze (Windows 2008 R2). W naszym środowisku każda witryna działa w różnych pulach aplikacji, ale w niektórych przypadkach do pul tych można przypisać tę samą tożsamość.
Nasza aplikacja tworzy klucz, jeśli nie istnieje, i umieszcza go w kontenerze o nazwie na podstawie bieżącej tożsamości. Pierwsza wdrożona strona zawsze działała, ale jeśli wdrożylibyśmy inną witrynę do innej puli aplikacji o tej samej tożsamości, druga nie powiedzie się.
Okazuje się, że po zapisaniu klucza system Windows daje pełny dostęp do użytkownika "IIS APPPOOL \ AppPoolName", a nie tożsamość, którą przypisaliśmy do puli.
Tak, nasze rozwiązanie było nadanie pojemnik wyraźne uprawnienia do aktualnej tożsamości (ten jest podobny do użytkownika @ WebMixer odpowiedź, jedyna różnica jest w 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);
może nie mieć zastosowania, ponieważ jestem uruchamianie tego samego kodu w dwóch różnych projektach, ale pod tym samym kontem użytkownika. – LamonteCristo
Czy to jest lokalizacja Windows XP? "C: \ ProgramData \ Microsoft \ Crypto \ RSA \ MachineKeys" to lokalizacja Vista (i więcej), jak sądzę. – granadaCoder