2011-01-21 15 views
8

'da zaten var. Her ikisi de aynı makinede çalışan kaynak kodunu bir uygulamadan diğerine kopyaladım. Her iki uygulamada da aynı containerName için aynı dizeyi kullanıyorum.Nesne RSACryptoServiceProvider

Yeni uygulamamın diğer uygulamada kaydedilen anahtarı okumasını engelleyen nedir? Bütün diğer şeyler kullanıcı hesabı vs. oturum, eşit

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

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

cevap

7

sen \ Documents and Settings" dosyalar için örneğin Herkes izinleri, vermek için Application Data \ Microsoft \ Crypto \ RSA \ Tüm Kullanıcılar denemek mü \ Makine Tuşlar", orada açıklandığı gibi: benim WCF hizmeti deposuna erişmek için izni yoktu çünkü

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

+0

uygulanmaz Mayıs Aynı kodu iki farklı projede, ancak aynı kullanıcı hesabı altında çalıştırarak. – LamonteCristo

+0

Windows XP konumu bu mu? "C: \ ProgramData \ Microsoft \ Crypto \ RSA \ MachineKeys" Bence Vista (ve yukarı) konumdur. – granadaCoder

5

:

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

Sadece bu problemle karşılaştım. "Aspnet_regiis -pa" SampleKeys komutunu kullanarak "NT AUTHORITY \ NETWORK SERVICE" 'işe yaramadı, ama çözümünüz işini yaptı. Çok teşekkürler! –

+1

"Herkes" yerine "yeni SecurityIdentifier (WellKnownSidType.WorldSid, null)" kodunu geçmek zorunda kaldım. Çalıştığımı varsayalım, çünkü "herkes" kullanıcısı makinemdeki dilime yerelleştirildi. – Tom

+2

Sadece bunu bulmak için FYI gibi, 'CryptoKeyAccessRule' kullanmak için, System.Security.AccessControl ', 'new SecurityIdentifier' ve' WellKnownSidType' kullanarak yapmak zorunda, '' System.Security.Principal' kullanarak. VS 2015, ad alanlarına yönelik düzeltmeler önermekle ilgili iyi bir şeydir, ancak adından daha iyi bir sürümünü kullanan herkes, ad alanlarını o kadar iyi bilmeyebilir, ne alacağını öğrenmek için zor olabilir. Varsayılan dışında olan şeyleri içe aktarırken montajlarınızı bize bildirin! – vapcguy

0

Geçenlerde bu konuda koştu Tek bir sunucuda birden çok dağıtılmış IIS sitesiyle (Windows 2008 R2). Çevremizdeki her site farklı uygulama havuzlarında çalışıyor, ancak bazı durumlarda bu havuzlar aynı kimliğe sahip olabilir.

Uygulamamız mevcut değilse bir anahtar oluşturur ve mevcut kimliğe dayalı bir ada sahip bir kapsayıcıya yerleştirir. İlk dağıtılan site her zaman işe yaradı, ancak başka bir siteyi aynı kimliğe sahip başka bir uygulama havuzuna dağıttığımızda ikincisi başarısız olur.

Anahtar depolandığında Windows, havuza atadığımız kimliği değil, "IIS APPPOOL \ AppPoolName" kullanıcısına tam erişim sağlar.

Yani, bizim çözüm konteynerin akım kimliğine açık izinler vermekti (bu @ WebMixer cevabı benzer, tek fark CryptoKeyAccessRule olan): Ben beri

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

'Yazılı olarak bunu eklemeyi denediğimde' System.Security.Principal.WindowsIdentity 'kaynağından' System.Security.Principal.IdentityReference 'seçeneğine dönüşemiyorum. Belki de yeni SecurityIdentifier (System.Security.Principal.WindowsIdentity.GetCurrent(). ToString()) 'gerekir? – vapcguy

+0

Emin değilim. Sanırım son birkaç yılda bir şey değişmiş olabilir. Kodu bir süre önce emekli ettik. –

+0

Bunu denedim, derler ama sistemde hata var.ArgumentException: Değer geçersizdi, bu yüzden beğenmedi. Bence bunun bir sözdizimi olduğunu düşünmüyorum - Tom'un Webmixer'in cevabı hakkındaki önerisini kullandım (“yeni SecurityIdentifier (WellKnownSidType.WorldSid, null)”). Webmixer'ın cevabını doğrudan kullanıp "herkes" i kullanmak için kullandım, "CryptographicException: Object zaten var". – vapcguy