我使用以下代码来获取访问令牌并连接到邮件文件夹:
var confidentialClientApplicationBuilder = ConfidentialClientApplicationBuilder.Create(clientId).WithClientSecret(clientSecret).WithTenantId(tenantId).Build();
var scopes = new string[] { ".default" };
var authToken = await confidentialClientApplicationBuilder.AcquireTokenForClient(scopes).ExecuteAsync();
var oauth2 = new SaslMechanismOAuth2(username, authToken.AccessToken);
using (ImapClient client = new ImapClient())
{
await client.ConnectAsync("outlook.office365.com", 993, SecureSocketOptions.SslOnConnect);
await client.AuthenticateAsync(oauth2);
//TODO
await client.DisconnectAsync(true);
}
这里一切似乎都正常工作,ImapClient 已连接,我可以看到oauth2.Credentials.Password
填充了访问令牌。但是,当我运行它时AuthenticateAsync
方法抛出错误:
MailKit.Security.AuthenticationException:“身份验证失败。”
我注意到authToken.Account
为空,这就是为什么我通过字符串传递帐户名username
。而且看来我必须使用.default
范围与其他任何内容都会导致错误AcquireTokenForClient
as 根据这个问题 https://stackoverflow.com/a/51789899/4631427.
你知道我在这里做错了什么吗?
看来你想要的现在已经不可能了。看这个 Github 问题 https://github.com/jstedfast/MailKit/issues/1126了解详情。
基本上,使用ConfidentialClientApplicationBuilder
只能使用 AppRegistration 上定义为“API 权限”的范围。如果您已经注册IMAP.AccessAsUser.All
or Mail.Read
图形权限,并使用以下方式请求它们https://graph.microsoft.com/.default
范围内,您将获得一个访问令牌,但它只能由 Microsoft 公开的 Graph API REST 端点使用。
MailKit 确实not支持这些 Graph API 端点(如链接问题所述)。
为了在 MailKit 中使用 IMAP 支持,您似乎必须使用以下命令获取访问令牌PublicClientApplicationOptions
正如在邮件套件示例 https://github.com/jstedfast/MailKit/blob/master/Documentation/Examples/OAuth2ExchangeExample.cs。这样做的缺点是会弹出浏览器要求用户进行身份验证。
然而,不确定这会持续多久,因为 Microsoft 似乎将弃用其 IMAP 端点(如之前链接的问题中所述)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)