我使用下面的代码来获取访问令牌并连接到邮件文件夹:
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
已用访问令牌填充。
邮件工具包。安全。身份验证异常:'验证失败。'
我注意到authToken.Account
是空的,这就是为什么我用字符串username
传递帐户名的原因。而且,我似乎必须使用.default
作用域,因为其他任何东西都会导致AcquireTokenForClient
上的错误per this question。
你知道我做错了什么吗
1条答案
按热度按时间jei2mxaa1#
目前似乎无法实现您的要求。有关详细信息,请参阅this Github issue。
基本上,使用
ConfidentialClientApplicationBuilder
只能使用在AppRegistration上定义为“API权限”的作用域。如果您已注册IMAP.AccessAsUser.All
或Mail.Read
Graph权限,并使用https://graph.microsoft.com/.default
作用域请求它们,您将获得一个访问令牌,但它只能由Microsoft公开的Graph API REST终结点使用。MailKit * 不 * 支持这些图形API端点(如链接问题所述)。
为了在MailKit中使用IMAP支持,你似乎必须使用
PublicClientApplicationOptions
获得一个访问令牌,如MailKit example中所示。这有一个缺点,即弹出浏览器,要求用户进行身份验证。然而,不确定这将持续多久,因为微软似乎将弃用他们的IMAP端点(如前面链接的问题中所述)