Gần đây tôi đã chạy vào vấn đề này với nhiều trang IIS được triển khai trên một máy chủ (Windows 2008 R2). Môi trường của chúng tôi có mỗi trang web chạy trên các hồ bơi ứng dụng khác nhau, nhưng trong một số trường hợp, các hồ bơi đó có thể được chỉ định cùng một danh tính.
Ứng dụng của chúng tôi tạo khóa nếu không tồn tại và đặt nó vào một vùng chứa có tên dựa trên danh tính hiện tại. Trang web được triển khai đầu tiên luôn hoạt động, nhưng nếu chúng tôi triển khai một trang web khác vào một nhóm ứng dụng khác có cùng một danh tính thì trang web thứ hai sẽ không thành công.
Chỉ ra rằng khi khóa được lưu trữ, Windows sẽ cấp quyền truy cập đầy đủ cho người dùng "IIS APPPOOL \ AppPoolName" và không phải là danh tính mà chúng tôi đã gán cho nhóm.
Vì vậy, giải pháp của chúng tôi là cung cấp cho các thùng chứa điều khoản rõ ràng với bản sắc hiện nay (điều này cũng tương tự như câu trả lời @ Webmixer, sự khác biệt duy nhất là trong 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);
Nguồn
2014-09-09 16:58:59
Có thể không áp dụng kể từ tôi chạy cùng một mã trong hai dự án khác nhau, nhưng trong cùng một tài khoản người dùng. – LamonteCristo
Đó có phải là vị trí của Windows XP không? "C: \ ProgramData \ Microsoft \ Crypto \ RSA \ MachineKeys" là vị trí Vista (và lên) tôi nghĩ. – granadaCoder