【问题标题】:Is it possible to use default network credentials with Mailkit and Exchange?Mailkit 和 Exchange 是否可以使用默认网络凭据?
【发布时间】:2016-11-01 23:28:57
【问题描述】:

我想使用 MailKit 通过我们的 Exchange 服务器发送一封电子邮件,使用该过程的凭据。

使用域/用户名/密码构建NetworkCredential有效

using (var client = new SmtpClient(ProtocolLogger))
{
    client.Connect(server, port);

    // Works
    var creds = new NetworkCredential(username, password, domain);
    client.Authenticate(creds);

    client.Send(msg);        
}

如果我在以同一用户身份运行时使用CredentialCache.DefaultNetworkCredentials,它失败并显示MailKit.Security.AuthenticationException

using (var client = new SmtpClient(ProtocolLogger))
{
    client.Connect(server, port);

    // Authentication failure
    client.Authenticate(CredentialCache.DefaultNetworkCredentials);

    client.Send(msg);        
}

ProtocolLogger 输出以下内容(邮件服务器和 base64 编码字符串已更改):

Connected to smtp://mymailserver:25/?starttls=when-available
S: 220 mymailserver Microsoft ESMTP MAIL Service ready at Thu, 30 Jun 2016 12:45:04 +0930
C: EHLO [172.1.1.2]
S: 250-mymailserver Hello [172.1.1.2]
S: 250-SIZE 51200000
S: 250-PIPELINING
S: 250-DSN
S: 250-ENHANCEDSTATUSCODES
S: 250-STARTTLS
S: 250-X-ANONYMOUSTLS
S: 250-AUTH NTLM LOGIN
S: 250-X-EXPS GSSAPI NTLM
S: 250-8BITMIME
S: 250-BINARYMIME
S: 250-CHUNKING
S: 250-XEXCH50
S: 250 XRDST
C: STARTTLS
S: 220 2.0.0 SMTP server ready
C: EHLO [172.1.1.2]
S: 250-mymailserver Hello [172.1.1.2]
S: 250-SIZE 51200000
S: 250-PIPELINING
S: 250-DSN
S: 250-ENHANCEDSTATUSCODES
S: 250-AUTH NTLM LOGIN
S: 250-X-EXPS GSSAPI NTLM
S: 250-8BITMIME
S: 250-BINARYMIME
S: 250-CHUNKING
S: 250-XEXCH50
S: 250 XRDST
C: AUTH NTLM {EncodedStringRemoved}
S: 334 {EncodedStringRemoved}
C: {EncodedStringRemoved}
S: 535 5.7.3 Authentication unsuccessful
C: AUTH LOGIN
S: 334 {EncodedStringRemoved}
C: 
S: 334 {EncodedStringRemoved}
C: 
S: 334 {EncodedStringRemoved}
C: QUIT
S: 334 {EncodedStringRemoved}

值得注意的是System.Net.Mail.SmtpClient 在将UseDefaultCredentials 属性设置为true 时使用DefaultNetworkCredentials,这对我有用。不过,我想使用 MailKit,因为它具有诸如 ProtocolLogging 之类的额外功能。

【问题讨论】:

  • 您是否在 PC 中设置了 Outlook 帐户。要使用默认凭据,必须在 PC 上设置 Outlook 帐户。因此,您必须首先运行 Outlook,它会在本地 PC 上为用户设置一个 Outlook 帐户,其中包含用户名和电子邮件帐户。然后将用户名链接到 PC 上的用户帐户,该帐户具有包括密码在内的用户凭据。然后将 Windows 凭据用作默认网络凭据。邮件服务器和 PC 都将使用组策略通过网络密码服务器验证密码。
  • 感谢您的信息。我正在我的开发工作站上进行测试,它确实为我设置了 Outlook。我也像我一样运行这个过程。有趣的是,当我使用内置的System.Net.Mail.SmtpClient 时,它确实有效,所以MailKit 和默认的SmtpClient 通过网络发送的内容肯定有所不同。我不知道有什么方法可以查看System.Net.Mail.SmtpClient 发送/接收的内容,就像使用 MailKil 一样。这将是理想的,所以我可以区分它们。
  • 您可以使用像 fiddler 这样的嗅探器来查看数据包。通常,Corp Networks 会阻止邮件电子邮件端口号,例如 587。交换的工作方式是使用代理服务器将电子邮件转发到交换。使用 Mailkit 可能是使用 587 并且是 Pop Server。 Pop 服务器不使用 DefaultCredentials,而是包含用户名和密码,通常会被阻止。
  • MailKit 使用他提供的任何端口。它也不使用 POP(他使用的是 SmtpClient,而不是 Pop3Client)。也就是说,DefaultCredentials 不起作用,因为无法从 DefaultNetworkCredential 对象获取用户/密码字符串(它们返回 string.Empty)。
  • @jdweng 我在未安装 Outlook 的服务器上使用集成安全性 (UseDefaultCredentials) 测试了内置的 SmtpClient,它运行良好。您的意思是需要在 任何 计算机上设置 Outlook 帐户才能正常工作吗?

标签: c# exchange-server mailkit


【解决方案1】:

您不能将 CredentialCache.DefaultNetworkCredentials 与 MailKit 一起使用,因为当 MailKit 要求凭据提供它需要发送到服务器的用户名和密码字符串时,DefaultNetworkCredentials 告诉 MailKit 用户名和密码字符串为空,因此 MailKit 尝试使用空字符串进行身份验证。

System.Net.Mail 似乎能够使用内部 API 来获取 MailKit 无法访问的真实字符串。

【讨论】:

  • 很遗憾,但我能理解为什么。这是内置客户端的一个很棒的功能,因为它意味着不必存储用户凭据。 mailkit 还有其他选择吗?
  • 所需的“内部”API 被称为 SSPI,实际上有据可查。 UriHender 在此处写下了使用 SSPI 的 MailKit 的 SASL 机制:github.com/jstedfast/MailKit/issues/332#issuecomment-398300208
  • 不幸的是,该解决方案只能在 Windows 上运行,但如果您在 Windows 上,那就太棒了 - 我在 6 月份错过了他的评论,因此感谢您发布此信息: -)
猜你喜欢
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
相关资源
最近更新 更多