凭证缓存问题

时间:2010-01-18 14:44:30

标签: c# asp.net

我有一个静态帮助器方法,我将其包裹在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;
     }

2 个答案:

答案 0 :(得分:1)

由于NetworkCredentials是一个类,您正在传递对您的nc变量的引用,这意味着当您解密密码时,您正在原始对象上解密它。

您需要克隆对象,或者仅在应用程序启动时执行此操作。

答案 1 :(得分:0)

有点hacky但只是把

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之前执行此操作,它就可以工作。