当前位置: 首页 > 知识库问答 >
问题:

Mailkit无法使用O365 oAuth2帐户进行身份验证

太叔鸿博
2023-03-14

我尝试在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、客户端机密和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

谢谢你的帮助。

共有1个答案

齐铭
2023-03-14

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

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

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

 类似资料:
  • 这是服务到服务身份验证中概述的规则的一个例外吗?该规则规定需要设置为接收服务的url(例如https://xxxxx.run.app)。和是一回事吗? 最后,除了使用googlecloudsdk(即imaging不存在)之外,是否还有其他方法使用用户帐户而不是服务帐户进行身份验证?

  • 我有一个带有AzureSQL后端的MS Access前端应用程序(accdb)。我目前正在使用SQL服务器身份验证,但我想使用某种活动目录。我没有本地广告,所以我最初考虑设置Azure广告。然而,我们的小团队已经在使用Office 365,据我所知,O365由Azure AD提供支持。 所以我的问题是,是否可以使用O365帐户(微软通常称之为“工作帐户”)来针对Azure SQL后端进行身份验证?

  • 我想使用 Firebase 构建一个 Android 应用。Firebase 提供了登录屏幕 https://github.com/firebase/firebase-login-demo-android 的演示代码。 但是,我希望用户能够使用用户已经在Android的集中式帐户管理器中输入的帐户信息,而不是让用户输入他们的帐户信息。 我已经在 https://developer.android.

  • 问题内容: 我正在尝试使用swift来对本地播放器进行身份验证,但是每次我为.authenticated属性获取错误值时,都无法使用。这是我正在使用的代码,应用启动时,主视图控制器会调用它。 它可以很好地显示登录视图,但是当我输入测试帐户登录名时,它只是将as 返回为false。iTunes Connect中的捆绑包标识符和info.plist完全相同,版本和应用程序名称也相同。iTunes Co

  • 我正在尝试使用Mailkit从我的Gmail中接收电子邮件: 行:客户端。身份验证(oauth 2);引发异常- MailKit.Security.AuthenticationException 我按照这个答案设置了我的Gmail API,但是后来我遇到了认证失败的问题。 这是日志: 范围,我使用:GmailService.Scope.Gmail只读,因为我只需要检索电子邮件。 将我的范围更新为:

  • 下面是示例代码:https://code.google.com/p/google-api-dotnet-client/wiki/oauth2#service_accounts 授权失败:dotnetOpenAuth.Messaging.ProtocolException:发送直接消息或获取响应时出错。 内部异常是System.net.WebException:远程服务器返回错误:(400)Bad