我尝试对我在 Azure 门户上创建的 O365 应用程序进行身份验证,但它没有按预期工作。
以下代码运行良好,但它使用登录名/密码,Microsoft 不建议这样做。 (在此处找到 https://github.com/jstedfast/MailKit/issues/989)
var scopes = new[] { "https://outlook.office365.com/IMAP.AccessAsUser.All" };
var confidentialClientApplication = PublicClientApplicationBuilder.Create(_clientId).WithAuthority(AadAuthorityAudience.AzureAdMultipleOrgs).Build();
SecureString securePassword = new NetworkCredential("", _userPassword).SecurePassword;
var acquireTokenByUsernamePasswordParameterBuilder = confidentialClientApplication.AcquireTokenByUsernamePassword(scopes, _userMail, securePassword);
var authenticationResult = acquireTokenByUsernamePasswordParameterBuilder.ExecuteAsync().Result;
if (_debugCall)
{
imapClient = new ImapClient(new ProtocolLogger(_configurationId + "_IMAP_" + DateTime.Now.ToString("yyyyMMddHHssffff") + ".log"));
}
else
{
imapClient = new ImapClient();
}
imapClient.CheckCertificateRevocation = false;
imapClient.ServerCertificateValidationCallback = (s, c, h, e) => true;
imapClient.Connect(_webServiceUrl, _webServicePort, SecureSocketOptions.Auto);
imapClient.Authenticate(new SaslMechanismOAuth2(_userMail, authenticationResult.AccessToken));
if (string.IsNullOrEmpty(_folder))
{
oFolder = imapClient.Inbox;
}
else
{
oFolder = imapClient.GetFolder(_folder);
}
oFolder.Open(FolderAccess.ReadWrite);
事实上,我希望能够使用tenanid、client secret和clientid进行身份验证,但没有交互模式(因为该应用程序是Windows服务)。
因此,我尝试使用带有tenantid、clientSecret 和ClientId 的另一个代码,但收到“身份验证失败”错误消息:
var confidentialClientApplication = ConfidentialClientApplicationBuilder
.Create(_clientId)
.WithClientSecret(_clientSecret)
.WithRedirectUri("http://localhost")
.WithAuthority(new Uri("https://login.microsoftonline.com/" + _tenantid + "/"))
.Build();
var scopes = new[] { "https://outlook.office365.com/.default" };
var authenticationResult = confidentialClientApplication.AcquireTokenForClient(scopes);
var authToken = authenticationResult.ExecuteAsync().Result;
var oauth2 = new SaslMechanismOAuth2(_userMail, authToken.AccessToken);
imapClient = new ImapClient(new ProtocolLogger("TEST_IMAP_" + DateTime.Now.ToString("yyyyMMddHHssffff") + ".log"));
imapClient.CheckCertificateRevocation = false;
imapClient.ServerCertificateValidationCallback = (s, c, h, e) => true;
imapClient.Connect(_webServiceUrl, _webServicePort, SecureSocketOptions.Auto);
imapClient.Authenticate(oauth2);
我在 Azure 门户上拥有我的应用程序的以下权限:
MSGraph
IMAP.AccessAsUser.All
Mail.Read
Mail.ReadWrite
Mail.Send
我错过了什么吗?恐怕不可能吧? Mailkit 官网的示例使用交互模式。
顺便说一句,我使用的是 Mailkit v2.4
感谢您的帮助。
答案 0 :(得分:1)
似乎 Microsoft Exchange IMAP/POP3/SMTP 协议不支持通过非交互式方法对 Office365 进行 OAUTH2 身份验证,并且使用非交互式方法访问 Office365 邮件的唯一方法是OAUTH2 身份验证的交互方法是通过 Microsoft.Graph API。
在过去的几个月里,我收到了很多关于这个的问题,据我所知,没有人(包括我自己)能够找到一种方法来完成这项工作。
我一直希望看到有人在 StackOverflow 上尝试这样做(甚至用另一种语言),并给出一个可接受的答案。到目前为止,我所看到的都是关于使用交互式方法的 OAuth2 的问题(正如您所见,我已经为 MailKit 编写了文档,并且众所周知可以很好地与 MailKit 配合使用)。