【问题标题】:Mailkit Can't authenticate with O365 oAuth2 accountMailkit 无法使用 O365 oAuth2 帐户进行身份验证
【发布时间】:2021-08-03 19:27:51
【问题描述】:

我尝试在 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、客户端密码和客户端ID 进行身份验证,但没有交互模式(因为应用程序是一个Windows 服务)。

所以我尝试使用另一个代码与租户 ID、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

感谢您的帮助。

【问题讨论】:

    标签: oauth-2.0 office365 mailkit


    【解决方案1】:

    似乎 Microsoft Exchange IMAP/POP3/SMTP 协议不支持通过非交互式方法对 Office365 进行 OAUTH2 身份验证,并且使用非交互式方法访问 Office365 邮件的唯一方法是OAUTH2 身份验证的交互方法是通过 Microsoft.Graph API。

    在过去的几个月里,我收到了很多关于这个问题的问题,据我所知,没有人(包括我自己)能够找到一种方法来完成这项工作。

    我一直希望在 StackOverflow 上看到有人尝试这样做(即使是用另一种语言),并得到可接受的答案。到目前为止,我所看到的都是关于使用交互式方法的 OAuth2 的问题(正如您所看到的,我已经为它编写了文档并且已知它可以很好地与 MailKit 配合使用)。

    【讨论】:

    • 您确定没有非交互式方法吗?使用EASendMail怎么样?
    猜你喜欢
    • 2020-06-24
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    相关资源
    最近更新 更多