2015-12-01 22 views
7

Nasza firma przełącza serwer pocztowy SMTP na Office 365. Kluczową kwestią jest to, że nowy serwer SMTP "smtp.office365.com" obsługuje tylko szyfrowanie TLS. Dlatego nie mogę użyć CredentialCache.DefaultNetworkCredentials do automatycznego zakodowania mojego hasła logowania do systemu Windows.Użyj DefaultNetworkCredential w szyfrowaniu 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"); 

Poprzednio to działa bez żadnego problemu. Ale jeśli teraz zmienić powyższy fragment do:

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

Jestem teraz coraz:

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 

ale jeśli mogę określić moje logowania użytkownika i hasło systemu Windows w kodzie to działa dobrze:

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

Więc:

  1. Czy to możliwe, w celu zakodowania hasło przy użyciu DefaultNetworkCredentials, ale sprawiają, że działa pod szyfrowanie TLS?
  2. Jeśli 1. nie jest możliwe, czy istnieje lepszy sposób zakodowania mojego hasła do systemu Windows w innym miejscu bez bezpośredniego ujawnienia go jako zwykłego tekstu w kodzie?

Odpowiedz

5

Dwa tematy - poświadczenia i szyfrowanie - nie są powiązane. DefaultNetworkCredentials działa tylko wtedy, gdy serwer pocztowy i komputer należą do tej samej "sieci" lub dokładniejszego, tego samego lub podłączonego serwera Active Directory. Zgaduję, że stary serwer SMTP był na miejscu i był częścią twojej sieci biurowej. Serwer O365 znajduje się w chmurze i nie udostępnia AD.

Po podaniu swoich poświadczeń jawnie działa, ponieważ O365 jest w stanie Cię uwierzytelnić.

Istnieje możliwość korzystania z usługi Azure Active Directory i jakoś połączenie go z lokalną usługą Active Directory. Nie znam szczegółów, ale wiem, że da się to zrobić. Wierzę, że jeśli ustawisz to poprawnie, DefaultNetworkCredentials zacznie działać ponownie.

Szczegóły dotyczące uwierzytelniania O365: https://blogs.office.com/2014/05/13/choosing-a-sign-in-model-for-office-365/

Jeśli chcesz zapisać hasło, trzeba przechowywać go zaszyfrowane. Zobacz tę odpowiedź: Best way to store encryption keys in .NET C#

1

W mojej sytuacji zaszyfrowuję sekcję web.config, w której przechowuję te poświadczenia. Podobnie przechowuję zaszyfrowaną wersję referencji w moim DB i miałem procedurę deszyfrowania ich w aplikacji.