2015-12-01 35 views
7

Công ty chúng tôi đang chuyển đổi máy chủ thư SMTP thành Office 365. Vấn đề chính là máy chủ SMTP mới "smtp.office365.com" chỉ hỗ trợ mã hóa TLS. Vì vậy, tôi không thể sử dụng CredentialCache.DefaultNetworkCredentials để tự động mã hóa mật khẩu đăng nhập Windows của mình.Sử dụng DefaultNetworkCredential trong mã hóa 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"); 

Trước đây, tác phẩm này không có bất kỳ vấn đề nào. Nhưng nếu bây giờ tôi thay đổi đoạn trên để:

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

Tôi bây giờ nhận được:

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 

Nhưng nếu tôi chỉ định tên đăng nhập Windows của tôi và mật khẩu trong mã nó hoạt động tốt:

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

Vì vậy:

  1. có thể mã hóa mật khẩu bằng cách sử dụng DefaultNetworkCredentials nhưng làm cho nó khả thi dưới mã hóa TLS?
  2. Nếu không thể, có cách nào tốt hơn để mã hóa mật khẩu Windows của tôi ở một nơi khác mà không trực tiếp tiết lộ nó dưới dạng văn bản thô trong mã không?

Trả lời

5

Hai chủ đề - thông tin đăng nhập và mã hóa - không liên quan. DefaultNetworkCredentials chỉ hoạt động khi máy chủ thư và máy tính của bạn thuộc cùng một "mạng" hoặc chính xác hơn, cùng một máy chủ Active Directory được kết nối hoặc tương tự. Tôi đoán rằng máy chủ SMTP cũ là tiền đề và là một phần của mạng văn phòng của bạn. Máy chủ O365 nằm trong đám mây và không chia sẻ AD.

Khi bạn cung cấp thông tin xác thực của mình một cách rõ ràng, nó hoạt động vì O365 có thể xác thực bạn.

Có khả năng sử dụng Azure Active Directory và bằng cách nào đó kết nối nó với Thư mục hoạt động chính xác của bạn. Tôi không quen với các chi tiết nhưng tôi biết nó có thể được thực hiện. Tôi tin rằng nếu bạn thiết lập chính xác, DefaultNetworkCredentials sẽ bắt đầu hoạt động trở lại.

chi tiết về xác thực O365: https://blogs.office.com/2014/05/13/choosing-a-sign-in-model-for-office-365/

Nếu bạn cần lưu trữ mật khẩu, bạn cần phải lưu trữ nó được mã hóa. Xem câu trả lời này: Best way to store encryption keys in .NET C#

1

Trong trường hợp của tôi, tôi mã hóa phần của web.config mà tôi lưu trữ các thông tin đăng nhập này. Tôi đã lưu trữ tương tự phiên bản mã hóa thông tin đăng nhập trong DB của mình và có thói quen giải mã chúng trong ứng dụng.

Các vấn đề liên quan