【问题标题】:Mailkit OAuth Hotmail A00000001 NO AUTHENTICATE failedMailkit OAuth Hotmail A00000001 NO AUTHENTICATE 失败
【发布时间】:2020-05-18 23:47:45
【问题描述】:

尝试通过 Mailkit Imap 使用 OAuth 连接到 Hotmail。

我尝试使用 Microsoft 的 Graph API 获取电子邮件,它可以正常工作,我可以连接到 Hotmails,获取电子邮件。所以这证明我在 Azure 上的配置是没问题的。

使用Mailkit时,代码如下:

    private async Task ConnectAndAuthenticateAsync()
    {
        SaslMechanismOAuth2 oauth2 = null;

        try
        {
            if (imapClient.IsConnected == false || imapClient.IsAuthenticated == false)
            {
                oauth2 = await GetOutlookCredentials();
                // outlook.office365.com imap-mail.outlook.com
                //imapClient.AuthenticationMechanisms.Clear();
                await imapClient.ConnectAsync("outlook.office365.com", 993, SecureSocketOptions.SslOnConnect);
                await imapClient.AuthenticateAsync(oauth2);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            throw ex;
        }

    }

   public async Task<SaslMechanismOAuth2> GetOutlookCredentials()
    {
        var response = new List<string>();

        var consoleCallback = new LogCallback((logLevel, message, bol) =>
        {
            response.Add(message);
            Console.WriteLine(message);
        });

        string authorityFormat = "https://login.microsoftonline.com/{0}/v2.0";
        string tenantId = "common";
        string redirectUri = "https://localhost:44394/";

        var scopes = new string[] { "https://outlook.office365.com/.default" };

        IConfidentialClientApplication app;
        var clientId = "xxxxx";

        app = ConfidentialClientApplicationBuilder.Create(clientId)
            .WithClientSecret("xxxxxx")
            .WithTenantId(tenantId)
            .WithRedirectUri(redirectUri)
            .WithLogging(consoleCallback)
            .Build();
        AuthenticationResult result = null;
        try
        {
            result = await app?.AcquireTokenForClient(scopes)?.ExecuteAsync();
        }
        catch (Exception ex)
        {
            response.Add($"{Environment.NewLine}==>{ex.Message}");
        }

        SaslMechanismOAuth2 oauth = new SaslMechanismOAuth2(clientId, result.AccessToken);
        return oauth;
    }

这是 Mailkit 日志:

Connected to imaps://imap-mail.outlook.com:993/
S: * OK The Microsoft Exchange IMAP4 service is ready. [TQBFAEEAUABSADAAMQBDAEEAMAAwADkANgAuAGEAdQBzAHAAcgBkADAAMQAuAHAAcgBvAGQALgBvAHUAdABsAG8AbwBrAC4AYwBvAG0A]
C: A00000000 CAPABILITY S: * CAPABILITY IMAP4 IMAP4rev1 AUTH=PLAIN AUTH=XOAUTH2 SASL-IR UIDPLUS ID UNSELECT CHILDREN IDLE NAMESPACE LITERAL+ 
S: A00000000 OK CAPABILITY completed.
C: A00000001 AUTHENTICATE XOAUTH2 dXNlcj0yODg4YmIxZi1jOTI1LTRjNzQtYjlhMi02ZmY4MDA4NzQ4MTIBYXV0aD1CZWFyZXIgZXlKMGVYQWlPaUpLVjFRaUxDSnViMjVqWlNJNkluVmtla1JQTXpreGRtTm1jSEpCYlZJd2NWTnZlbFYzZUZsa2IyZHNZbk5DT0RORloxVlhPRU5rUTFFaUxDSmhiR2NpT2lKU1V6STFOaUlzSW5nMWRDSTZJbGxOUlV4SVZEQm5kbUl3YlhodlUwUnZXV1p2YldweFptcFpWU0lzSW10cFpDSTZJbGxOUlV4SVZEQm5kbUl3YlhodlUwUnZXV1p2YldweFptcFpWU0o5LmV5SmhkV1FpT2lKb2RIUndjem92TDI5MWRHeHZiMnN1YjJabWFXTmxNelkxTG1OdmJTSXNJbWx6Y3lJNkltaDBkSEJ6T2k4dmMzUnpMbmRwYm1SdmQzTXVibVYwTDJZNFkyUmxaak14TFdFek1XVXROR0kwWVMwNU0yVTBMVFZtTlRjeFpUa3hNalUxWVM4aUxDSnBZWFFpT2pFMU9EWXhOakF6Tmprc0ltNWlaaUk2TVRVNE5qRTJNRE0yT1N3aVpYaHdJam94TlRnMk1UWTBNalk1TENKaGFXOGlPaUkwTW1SbldVeHFURXR1Y0VjMWRuWnpNVzlRV0dGdU1XNDNkbWcxUWtGQlBTSXNJbUZ3Y0Y5a2FYTndiR0Y1Ym1GdFpTSTZJbEJoY0dGNVpXVWlMQ0poY0hCcFpDSTZJakk0T0RoaVlqRm1MV001TWpVdE5HTTNOQzFpT1dFeUxUWm1aamd3TURnM05EZ3hNaUlzSW1Gd2NHbGtZV055SWpvaU1TSXNJbWxrY0NJNkltaDBkSEJ6T2k4dmMzUnpMbmRwYm1SdmQzTXVibVYwTDJZNFkyUmxaak14TFdFek1XVXROR0kwWVMwNU0yVTBMVFZtTlRjeFpUa3hNalUxWVM4aUxDSnphV1FpT2lJM1pUWXdaR1psWXkxbE5qbGpMVFJoTnpndFlUWTVNQzB6T0dWa01qaGtZakZtTmpraUxDSjBhV1FpT2lKbU9HTmtaV1l6TVMxaE16RmxMVFJpTkdFdE9UTmxOQzAxWmpVM01XVTVNVEkxTldFaUxDSjFkR2tpT2lJNGNDMW9aVmhyWWxaRlR6VkxPV3RFU25rd05rRkJJaXdpZG1WeUlqb2lNUzR3SW4wLllOY3RMWVA0LV9NWkxfMWpwalJQSUU5bzlQV3NDSUtoZTM4UnFYSXVVS0ZBaVJLTXJLTXhfakFQQWhpZkNibnBJdl94Ylk1YkpLcmJTV1JVTFRFZHhNb0tBMUlVZmFpNURzb25qQXlwTGtuS3JoVTFvOHV1MUV3UDlGeW5xZHVNb2lKamJ1SndXY09tWUlUQmp0MXR1bW5SVmptRFUyYTdxbUZMMDljNTBzNG1SbHpTWjJXSjRYYUVfQVFIUG9GOTJhMjY3SjM4SU95ZnpYYlh6WWJlX1JKaGNtT0I5R25lQnRvRFY0WFRWTjhhMjBBTmhIRnc1bVVSMi1qQzVHa1U3N3dsNU1zS1B3ODIwMGlBbHZoVGh2RGY0T2lKWlVIMFl4TUd5YmFadGZVNDcyRHdYcWp4WFdBWlg5TERJRDdYS3NBWU1pWHlhWDRiaWpZTlJuQ2h3ZwEB
S: A00000001 NO AUTHENTICATE failed.

值得一提的是:

await imapClient.ConnectAsync("outlook.office365.com", 993, SecureSocketOptions.SslOnConnect);

成功了,就是下一行代码报错

await imapClient.AuthenticateAsync(oauth2);


更新 1

更新 2

我发现a document 说:Office365 Oauth 不支持 SMTP/IMAP4,只支持 EWS。

这是否意味着我们将无法通过 IMap4 为 Hotmail 使用 OAuth?

更新 3

我发现有两组不同的 Mail.Read,一组来自 Graph,一组来自 Exchange,以及来自 Exchange 的 EWS.AccessAsUser.All,因为我正在学习 https://www.emailarchitect.net/eagetmail/sdk/?ct=object_oauth_live 的教程

我现在完全迷失了,不知道我应该使用哪一套。

【问题讨论】:

    标签: c# microsoft-graph-api mailkit


    【解决方案1】:

    不要使用clientId 作为用户名。那不是用户名。

    【讨论】:

    • 嗨@jstedfast,我使用客户端ID作为服务中的第一个参数来调用Gmail并且它有效,这就是我继续将它用于Hotmail的原因。我认为在这种情况下 Azure 的用户名是客户端 ID。请参阅我的更新 1 屏幕截图。没有什么叫做用户名。
    • 截图与凭证无关。当 Hotmail 用户登录阅读他们的电子邮件时,他们是否使用 GUID clientId?还是他们使用他们的电子邮件地址?提示:他们使用他们的电子邮件地址,而不是 GUID。
    • 感谢您的更新。我正在尝试使用 OAuth 访问用户的电子邮件,而不是他们的实际电子邮件地址。这就是我使用客户端 ID 的原因。
    • 那……对我来说仍然没有意义,但我知道什么?
    【解决方案2】:

    请求的令牌不包含有关邮箱的任何信息。尽管您正确请求令牌,但此令牌不能用于访问 IMAP 邮箱。您还需要将邮箱的电子邮件地址或用户名添加到令牌中。但是根据https://docs.microsoft.com/en-us/azure/active-directory/develop/msal-net-client-assertions 的文档,没有相应的声明可以添加到令牌中。

    要使用服务帐户的 OAuth2 令牌访问 Google 邮箱,您必须在“sub”声明中提供邮箱的电子邮件地址。用你的方法这是不可能的。 AcquireTokenForClient 要求 "iss" (client-id) 和 "sub" 匹配。

    【讨论】:

    • 感谢 Kay,我已经放弃使用 Mailkit 从 Hotmail 获取电子邮件。我现在使用 Microsoft Graph 来执行此操作。如果您能提供一个示例来演示如何使用 Mailkit 连接和获取来自 Google 和 Hotmail 的电子邮件,那就太好了。
    猜你喜欢
    • 2021-06-16
    • 2020-09-17
    • 2017-01-29
    • 2021-06-02
    • 1970-01-01
    • 2022-11-21
    • 2017-09-29
    • 2019-12-19
    • 1970-01-01
    相关资源
    最近更新 更多