代码之家  ›  专栏  ›  技术社区  ›  xzk

mailkit验证失败

  •  1
  • xzk  · 技术社区  · 6 年前

    我的问题:

    相同的代码在一个实例中可以正常工作,但不能在项目的另一个实例中使用相同的用户名/密码进行身份验证。

    我的代码:

    static NetworkCredential _emailLoginCredentials;
    _emailLoginCredentials = new NetworkCredential(_accountName, _accountPassword, _accountDomain);
    
    using (var client = new ImapClient(new ProtocolLogger("C://Temp//Logs//imap1.log")))
    {
        var credentials = _emailLoginCredentials;
        var uri = new Uri(_emailServer);
        string serverReply = String.Empty;
    
        client.Timeout = _imapClientTimeOut;
        client.Connect(uri);
        client.AuthenticationMechanisms.Remove("XOAUTH2");
        client.Authenticate(credentials);
        client.Inbox.Open(FolderAccess.ReadWrite);
    }
    

    错误:

    Connected to imap://mail.company.com:143/?starttls=when-available
    S: * OK The Microsoft Exchange IMAP4 service is ready.
    C: A00000000 CAPABILITY
    S: * CAPABILITY IMAP4 IMAP4rev1 AUTH=NTLM AUTH=GSSAPI AUTH=PLAIN UIDPLUS CHILDREN IDLE NAMESPACE LITERAL+
    S: A00000000 OK CAPABILITY completed.
    C: A00000001 AUTHENTICATE PLAIN
    S: +
    C: ZljbAY3hDYXJhdHNkZXYAQ2FyYXRzMTIz
    S: A00000001 NO AUTHENTICATE failed.
    C: A00000002 LOGIN username Password
    S: A00000002 NO LOGIN failed.
    

    来自工作项目的日志(相同代码):

    Connected to imap://mail.company.com:143/?starttls=when-available
    S: * OK The Microsoft Exchange IMAP4 service is ready.
    C: A00000000 CAPABILITY
    S: * CAPABILITY IMAP4 IMAP4rev1 AUTH=NTLM AUTH=GSSAPI AUTH=PLAIN UIDPLUS CHILDREN IDLE NAMESPACE LITERAL+
    S: A00000000 OK CAPABILITY completed.
    C: A00000001 AUTHENTICATE PLAIN
    S: +
    C: AN4FyYXRzZGV2AENhcmF0czEyMw==
    S: A00000001 OK AUTHENTICATE completed.
    

    为了解决这个问题,我甚至硬编码了用户名和密码。然而,结果仍然是一样的——一个工作,另一个不工作。

    嗯,在项目设置等方面有一些不同。例如,在非工作项目中,我在互斥体中使用上面的身份验证代码。另外,整个方法是 protected override async Task Process(TaskMessage message)

    找到了这篇文章,但它是由与我的案件无关的NTLM引起的。

    Mailkit Authenticate to Imap fails

    1 回复  |  直到 6 年前
        1
  •  2
  •   arnt    6 年前

    普通身份验证包含两个或三个字符串:“我希望以X身份登录,实际上是Y,密码是Z”。两种常见情况是x=y和x未指定。极少数情况下,Y是一个超级duper特权管理用户,可以作为其他用户登录。

    在您的工作案例中,x是空的,y是xcarastdev。在您的错误案例中,x是gicnt。在这两种情况下,您的密码是相同的(在base64 blobs中)。你的下一个工作是找出Gicnt的来源。但首先,更改密码。