RSACryptoServiceProvider 引發的異常曾讓我抓狂,特此總結核心問題與解決之道,供遇到類似困境的開發者參考。
WindowsIdentity wi = Logon(UserName, Password);
if (null != wi) {
WindowsImpersonationContext wic = wi.Impersonate();
CspParameters cp = new CspParameters();
cp.ProviderType = 1;
cp.Flags = CspProviderFlags.UseMachineKeyStore;
cp.KeyNumber = (int)KeyNumber.Exchange;
cp.KeyContainerName = "KEY_1";
RSACryptoServiceProvider csp = new RSACryptoServiceProvider(cp);
this.txtPublicKey.Text = this.PublicKey = csp.ToXmlString(false);
csp.Clear();
wic.Undo();
}
現象:部署至 IIS 後間歇性拋出異常。
位置:XP 下 aspnet_wp.exe,Server 2003 下 w3wp.exe。
在模擬身份期間創建金鑰對,加解密後必須在撤銷模擬前呼叫 Clear() 釋放金鑰。正確順序:
現象:RSACryptoProvider 創建金鑰檔案但因權限不足無法刪除。
確認代理服務帳戶對 RSA 機器金鑰資料夾(如 C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA)擁有「完全控制」權限。
現象:僅在客戶機器出現,本地所有機器無法重現。客戶環境無法遠程調試。
C:\Documents and Settings\%userName%\Application Data\Microsoft\Crypto 目錄。問題暫時告一段落。若對你有幫助,記得頂一下。