2015-12-01 37 views
7

我們公司正在將SMTP郵件服務器切換到Office 365.關鍵問題是新的SMTP服務器「smtp.office365.com」僅支持TLS加密。因此我不能使用CredentialCache.DefaultNetworkCredentials自動對我的Windows登錄密碼進行編碼。在TLS加密下使用DefaultNetworkCredential?

 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"); 

此前這項工作沒有任何問題。但是,如果我現在改變上面的代碼段:

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

我現在越來越:

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 

但是,如果我在指定的代碼我的Windows登錄用戶名和密碼,它工作得很好:

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

所以:

  1. 是否有可能編碼使用DefaultNetworkCredentials的密碼,但使其在TLS加密下可行?
  2. 如果1.是不可能的,有沒有更好的方法來編碼我的Windows密碼的其他地方,而不是直接在代碼中顯示爲明文?

回答

5

兩個主題 - 憑證和加密 - 是無關的。 DefaultNetworkCredentials僅適用於郵件服務器和計算機屬於同一個「網絡」或更精確,相同或連接的Active Directory服務器。我在猜測舊的SMTP服務器是在內部部署的,並且是你的辦公網絡的一部分。 O365服務器位於雲中,不共享AD。

當您明確提供您的憑證時,它會起作用,因爲O365能夠驗證您的身份。

有可能使用Azure Active Directory並以某種方式將其連接到您的內部Active Directory上。我對細節並不熟悉,但我知道它可以完成。我相信如果你正確設置了這個,DefaultNetworkCredentials將會重新開始工作。約O365認證

詳情:https://blogs.office.com/2014/05/13/choosing-a-sign-in-model-for-office-365/

如果你需要存儲的密碼,你需要將它存儲加密。看到這個答案:Best way to store encryption keys in .NET C#

1

在我的情況下,我加密了我存儲這些證書的web.config部分。我同樣在我的數據庫中存儲了證書的加密版本,並有一個例程在應用程序中解密它們。