.NET gMSA服务无法对Exchange SMTP进行身份验证
我有一个在gMSA(组托管服务账户)下运行的.NET Windows服务。
SMTP服务器是一个云服务器 "hosted on IIS"(传统的IIS SMTP虚拟服务器或在IIS后面的Exchange收件连接器)。匿名身份验证已启用。
向内部的单个用户发送邮件在不进行身份验证的情况下使用MailKit可以正常工作。然而,向Exchange的分发组发送邮件会失败,除非发件人经过身份验证(默认的Exchange行为:分发组需要经过身份验证的发件人)。
如果我尝试进行身份验证,我会得到:
MailKit.Security.AuthenticationException: 504: 5.7.4 Unrecognized authentication type
at MailKit.Net.Smtp.SmtpClient.AuthenticateAsync(SaslMechanism mechanism, CancellationToken cancellationToken)
使用 System.Net.Mail 在使用gMSA之后向内部和分发组发送邮件都失败。当使用普通服务账户时,一切正常。但我们正在迁移到gMSA。
我得到
System.Net.Mail.SmtpException: Failure sending mail.
System.IO.IOException: Unable to read data from the transport connection: The connection was closed.
我的代码长成这样:
using SmtpClient client = new();
await client.ConnectAsync(host, 25, SecureSocketOptions.None, cancellationToken);
SaslMechanismGssapi gssapi =
new(System.Net.CredentialCache.DefaultNetworkCredentials);
await client.AuthenticateAsync(gssapi, cancellationToken);
await client.SendAsync(message, cancellationToken);
await client.DisconnectAsync(true, cancellationToken);
解决方案
504: 5.7.4 Unrecognized authentication type 通常意味着你尝试使用的认证机制不被服务器支持。
在你的情况下,这意味着服务器很可能不支持GSSAPI。
有几种方法可以获取服务器支持的认证机制列表:
- 通过如下方式实例化SmtpClient来启用日志记录:
using SmtpClient client = new(new ProtocolLogger("smtp.log"));,运行你的代码,然后在文本编辑器中查看smtp.log,看看在EHLO响应中报告了哪些AUTH=...机制。 - 你可以访问
client.AuthenticationMechanismsHashSet以查看它包含了哪些值:
Console.WriteLine("Supported AUTH mechanisms: {0}", string.Join(", ", client.AuthenticationMechanisms));
一旦知道哪些是受支持的,就相应地更新代码以使用其中一个。