oauth-2.0 MailKit OAuth2.0出现身份验证失败异常

7hiiyaii  于 2022-10-31  发布在  其他
关注(0)|答案(1)|浏览(385)

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

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
你知道我做错了什么吗

jei2mxaa

jei2mxaa1#

目前似乎无法实现您的要求。有关详细信息,请参阅this Github issue
基本上,使用ConfidentialClientApplicationBuilder只能使用在AppRegistration上定义为“API权限”的作用域。如果您已注册IMAP.AccessAsUser.AllMail.Read Graph权限,并使用https://graph.microsoft.com/.default作用域请求它们,您将获得一个访问令牌,但它只能由Microsoft公开的Graph API REST终结点使用。
MailKit * 不 * 支持这些图形API端点(如链接问题所述)。
为了在MailKit中使用IMAP支持,你似乎必须使用PublicClientApplicationOptions获得一个访问令牌,如MailKit example中所示。这有一个缺点,即弹出浏览器,要求用户进行身份验证。
然而,不确定这将持续多久,因为微软似乎将弃用他们的IMAP端点(如前面链接的问题中所述)

相关问题