2010-01-18 5 views
0

J'ai une méthode d'aide statique que j'emballe autour de SMTPClient pour envoyer un courrier électronique.Problème de mise en cache des informations d'identification

Je stocke l'authentification SMTP dans le fichier web.config -> à l'emplacement par défaut que les objets de l'espace de noms System.Net recherchent.

Je transmets les informations d'identification au client SMTP, car je souhaite exécuter le décryptage de mon mot de passe sur le mot de passe avant que le client SMTP n'utilise ce code.

Le problème que je rencontre ici est le suivant: lorsque je l'exécute une fois, le mot de passe est stocké quelque part comme "décrypté" dans le cache. Lorsque j'essaie d'exécuter cette méthode une seconde fois dans la même session, j'obtiens une erreur, car elle essaie de déchiffrer un mot de passe déjà déchiffré lors de la première exécution. Des idées?

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; 
    } 

Répondre

1

Comme NetworkCredentials est une classe que vous passez une référence à votre variable nc Cela signifie que lorsque vous déchiffrez le mot de passe que vous décryptant sur l'objet d'origine.

Vous avez besoin de cloner l'objet ou seulement une fois lorsque votre application démarre.

+0

Merci. Pourquoi reste-t-il en mémoire si je l'utilise en statique? – user53885

+0

Serait-il possible de me montrer un bref exemple de comment faire cela dans Global.asax? Tout en étant capable de l'utiliser à partir d'un statique? – user53885

+0

Interne par rapport à l'objet SmtpClient, les informations d'identification sont définies via une propriété statique. Ainsi, bien que votre SmtpClient soit instancié à chaque requête, les informations d'identification sont remplies en utilisant le même objet statique. Cela signifie que toutes les instances de SmtpClient utilisent réellement la même instance statique de NetworkCredentials. Cette propriété conserve la même référence d'objet pour toute la durée de vie de l'application. – Mark

0

Un peu hacky mais juste mettre

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

en vous global.asax pourrait le faire. Et puis ayant

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

dans votre méthode statique, même si je suis sûr qu'il doit y avoir une solution plus élégante. Mise à jour: Vous pourriez probablement essayer d'utiliser SmtpNetworkElement et mettre à jour le mot de passe à ce sujet dans global.asax - je pense que tant que vous faites cela avant d'utiliser SmtpClient cela peut fonctionner.