2015-12-01 28 views
7

La nostra azienda sta passando il server di posta SMTP a Office 365. Il problema chiave è il nuovo server SMTP "smtp.office365.com" supporta solo la crittografia TLS. Quindi non posso usare CredentialCache.DefaultNetworkCredentials per codificare automaticamente la mia password di accesso a Windows.Utilizzare DefaultNetworkCredential con la crittografia TLS?

 var smtpClient = new SmtpClient("smtp.oldserver.com") 
     { 
      Credentials = CredentialCache.DefaultNetworkCredentials 
     }; 

     const string from = "[email protected]"; 
     const string recipients = "[email protected]"; 
     smtpClient.Send(from, recipients, "Test Subject", "Test Body"); 

In precedenza questo funziona senza problemi. Ma se ora posso cambiare il frammento di codice a:

 var smtpClient = new SmtpClient("smtp.office365.com"); 
     smtpClient.EnableSsl = true; 
     smtpClient.Port = 587; 
     smtpClient.Credentials = CredentialCache.DefaultNetworkCredentials; 

ora sto ricevendo:

Unhandled Exception: System.Net.Mail.SmtpException: The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.7.57 SMTP; Client was not authenticated to send anonymous mail during MAIL FROM 

Ma se a specificare il nome utente e la password di login di Windows nel codice funziona benissimo:

smtpClient.Credentials = new NetworkCredential("[email protected]", "mypassword"); 

Quindi:

  1. E 'possibile codificare i password utilizzando DefaultNetworkCredentials ma renderlo fattibile con la crittografia TLS?
  2. Se 1. non è possibile, c'è un modo migliore per codificare la mia password di Windows da qualche altra parte senza rivelarla direttamente come testo in chiaro nel codice?

risposta

5

I due argomenti - credenziali e crittografia - non sono correlati. DefaultNetworkCredentials funziona solo quando il server di posta elettronica e il computer appartengono alla stessa "rete" o ad essere più precisi, lo stesso server di Active Directory collegato. Immagino che il vecchio server SMTP fosse on premise e facesse parte della rete dell'ufficio. Il server O365 è nel cloud e non condivide l'annuncio.

Quando si forniscono le credenziali in modo esplicito, funziona perché O365 è in grado di autenticarsi.

Esiste la possibilità di utilizzare Azure Active Directory e in qualche modo collegarlo alla vostra Active Directory on-premise. Non ho familiarità con i dettagli ma so che si può fare. Credo che se si imposta correttamente, DefaultNetworkCredentials inizierà a funzionare di nuovo.

dettagli sull'autenticazione O365: https://blogs.office.com/2014/05/13/choosing-a-sign-in-model-for-office-365/

Se avete bisogno di memorizzare la password, è necessario conservarlo crittografato. Vedi questa risposta: Best way to store encryption keys in .NET C#

1

Nella mia situazione ho crittografare la sezione del web.config che posso conservare queste credenziali in. Ho simile conservato una versione crittografata delle credenziali nella mia DB e aveva una routine per decifrarli nell'applicazione.

Problemi correlati