2010-01-18 18 views
0

전자 메일을 보내기 위해 SMTPClient를 둘러싼 고정 도우미 메서드가 있습니다.자격증 명 캐싱 문제

System.Net 네임 스페이스 개체가 찾는 기본 위치의 web.config ->에 SMTP 인증을 저장합니다.

SMTPClient가 암호를 사용하기 전에 암호 해독을 실행하고 싶기 때문에 자격 증명을 SMTPClient에 전달하고 있습니다.

제가 여기에서 마주 치게되는 문제는 - 암호를 한 번 실행하면 암호가 어떻게 든 캐시에 "해독 된"것으로 저장된다는 것입니다. 동일한 세션에서이 메서드를 두 번째 시도하면 오류가 발생합니다. 암호가 처음 실행될 때 이미 암호 해독 된 암호를 해독하려고하기 때문에 오류가 발생합니다. 어떤 아이디어? NetworkCredentials으로

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

당신이 원래 객체에 암호를 해독하는 암호를 해독 할 때 이것이 의미하는 당신이 당신의 NC 변수의 참조를 전달하는 클래스입니다.

개체를 복제해야하거나 응용 프로그램이 시작될 때 한 번만 수행해야합니다. 조금 해키하지만 단지 그것을 할 수 Global.asax에 당신을

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

퍼팅

+0

감사합니다. 정적으로 사용하고 있다면 왜 메모리에 머물러 있습니까? – user53885

+0

Global.asax에서이 작업을 수행하는 방법에 대한 간단한 샘플을 보여줄 수 있습니까? 여전히 정적에서 사용할 수 있습니까? – user53885

+0

SmtpClient 개체의 내부에서 자격 증명은 정적 속성을 통해 설정됩니다. 따라서 SmtpClient가 각 요청을 인스턴스화하더라도 자격 증명은 동일한 정적 개체를 사용하여 채워집니다. 이것은 모든 SmtpClient 인스턴스가 실제로 NetworkCredentials의 동일한 정적 인스턴스를 사용하고 있음을 의미합니다. 이 속성은 응용 프로그램의 전체 수명 동안 동일한 객체 참조를 유지합니다. – Mark

0

. 그리고 나서 더 세련된 솔루션이 있어야한다고 확신하지만 정적 방법으로

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

을 사용하는 것이 좋습니다.

업데이트 : 아마도 SmtpNetworkElement를 사용하고 global.asax에서 암호를 업데이트 해 볼 수 있습니다. SmtpClient를 사용하기 전에이 작업을 수행하는 것이 좋습니다.