2011-01-21 16 views
8

Skopiowałem kod źródłowy z jednej aplikacji do drugiej, obie działają na tym samym komputerze. Używam również ten sam ciąg dla containerName poniżej w obu aplikacjach.Obiekt już istnieje w RSACryptoServiceProvider

Co uniemożliwia mojej nowej aplikacji odczytanie klucza zapisanego w drugiej aplikacji? Wszystkie inne rzeczy są równe, zalogowany konta użytkownika itp

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

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

Odpowiedz

7

Czy spróbować udzielić uprawnienia do wszystkich, na przykład dla plików w „Documents and Settings \ All Users \ Dane aplikacji \ Microsoft \ Crypto \ RSA Klucze maszynowe \”, gdyż opisane tam:

http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/f7b9f928-a794-47f2-a5bd-9f64ca375040

+0

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

+0

Czy to jest lokalizacja Windows XP? "C: \ ProgramData \ Microsoft \ Crypto \ RSA \ MachineKeys" to lokalizacja Vista (i więcej), jak sądzę. – granadaCoder

5

Innym rozwiązaniem jest ustawienie dostępu do każdego kodem:

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); 
+0

Wpadłem na ten problem. Używanie polecenia 'aspnet_regiis -pa" SampleKeys "" ZARZĄDZANIE NT \ USŁUGA SIECI "' nie działało, ale twoje rozwiązanie wykonało zadanie. Wielkie dzięki! –

+1

Zamiast "wszyscy" musiałem przekazać 'new SecurityIdentifier (WellKnownSidType.WorldSid, null)'. Zakładam, że nie zadziałał, ponieważ użytkownik "każdy" jest zlokalizowany na moim komputerze na moim komputerze. – Tom

+2

Tak jak FYI dla każdego, kto to znajdzie, aby użyć 'CryptoKeyAccessRule', musisz zrobić' using System.Security.AccessControl', i dla 'new SecurityIdentifier' oraz' WellKnownSidType', to 'using System.Security.Principal'. VS 2015 jest dobry w sugerowaniu poprawek dla przestrzeni nazw, ale każdy, kto używa wersji wcześniej, może nie znać tak dobrze przestrzeni nazw, może mieć trudności ze znalezieniem tego, co można zaimportować. Poinformuj nas o swoich złożeniach, gdy importujesz rzeczy, które są poza domyślnymi !!! – vapcguy

0

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); 
+0

Mam 'Nie można przekonwertować z 'System.Security.Principal.WindowsIdentity' na 'System.Security.Principal.IdentityReference'' kiedy próbowałem wstawić to, jak napisałem. Może potrzebuje 'new SecurityIdentifier (System.Security.Principal.WindowsIdentity.GetCurrent(). ToString())'? – vapcguy

+0

Nie jestem pewien. Sądzę, że coś mogło się zmienić w ciągu ostatnich kilku lat. Wycofaliśmy kod powyżej jakiś czas temu. –

+0

Próbowałem go, kompilował, ale dostałem komunikat "System.ArgumentException: Value was invalid', więc nie podobało się to. Nie sądzę jednak, że jest to składnia - mam to samo, używając sugestii Toma na temat odpowiedzi Webmixera ('new SecurityIdentifier (WellKnownSidType.WorldSid, null)'). Jeśli użyłem odpowiedzi Webmixer bezpośrednio, aby użyć '' everyone '', mam' CryptographicException: Object already exists'. – vapcguy

Powiązane problemy