MailKit OAuth2.0 身份验证失败异常

2024-03-13

我使用以下代码来获取访问令牌并连接到邮件文件夹:

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(使用前将#替换为@)

MailKit OAuth2.0 身份验证失败异常 的相关文章

随机推荐