2010-01-18 83 views
0

我有一個靜態輔助方法,可以繞過SMTPClient發送電子郵件。憑證緩存問題

我將SMTP認證存儲在web.config - > System.Net命名空間對象查找的默認位置。

我將憑據傳遞給SMTPClient,因爲我想在SMTPClient使用此密碼之前在密碼上運行我的密碼解密。

我在這裏遇到的問題是 - 當我運行一次這個密碼時,密碼在緩存中以某種方式被「解密」。當我在同一個會話中第二次嘗試運行此方法時,出現錯誤,因爲它試圖解密第一次運行時已解密的密碼。有任何想法嗎?

public static void SendEmail(MailMessage mailMessage) 
    { 
     SmtpClient smtpClient = new SmtpClient(); 
     NetworkCredential nc = new NetworkCredential(); 
     nc = (NetworkCredential)smtpClient.Credentials; 
     nc.Password = Tools.Decrypt(nc.Password); 
     smtpClient.Credentials = nc; 
     smtpClient.Send(mailMessage); 
     nc = null; 
     smtpClient.Credentials = null; 
    } 

回答

1

由於NetworkCredentials是您傳遞到您的NC變量的引用的類,這意味着當你解密你解密它的原始對象上的密碼。

您可能需要克隆該對象,或者只在應用程序啓動時執行一次該操作。

+0

謝謝。如果我在靜態中使用它,爲什麼它會留在內存中? – user53885 2010-01-18 14:56:29

+0

有沒有可能向我展示如何在Global.asax中執行此操作的簡短示例?雖然仍然能夠從靜態使用它? – user53885 2010-01-18 15:12:44

+0

在SmtpClient對象的內部,通過靜態屬性設置憑證。因此,儘管您的SmtpClient已實例化,但每個請求憑證都使用相同的靜態對象進行填充。 這意味着所有SmtpClient實例實際上都使用NetworkCredentials的相同靜態實例。該屬性在應用程序的整個生命週期中保持相同的對象引用。 – Mark 2010-01-18 15:23:32

0

一點點哈克,但只是把

SmtpClient smtpClient = new SmtpClient(); 
NetworkCredential nc = new NetworkCredential(); 
nc = (NetworkCredential)smtpClient.Credentials; 
nc.Password = Tools.Decrypt(nc.Password); 
smtpClient.Credentials = nc; 
smtpClient = null; 

在您的Global.asax可能做到這一點。然後有你的靜態方法

SmtpClient smtpClient = new SmtpClient(); 
smtpClient.Send(mailMessage); 
smtpClient = null; 

,但我確定必須有一個更優雅的解決方案。

更新:你也許可以嘗試使用SmtpNetworkElement並在global.asax上更新密碼 - 我想只要你在使用SmtpClient之前這樣做,它可能會工作。