0

我正在尝试使用 IMAP 访问 Exchange 中的共享邮箱,但我不想将密码存储在应用程序中,因此我尝试了 NTLM 身份验证。

我能够使用 SSPI 框架 api 进行身份验证,但现在我正在努力选择共享收件箱。

使用“基本”身份验证我知道我可以做到:

  a LOGIN domain/username/mailboxalias username_password //a OK LOGIN completed.
  b select inbox //...\r\nb OK [READ-WRITE] SELECT completed."

这确实工作正常,但我不想在我的应用程序中存储密码,所以我使用 NTLM 身份验证(连接到存储邮箱别名的 exchangeserver1.domain.com):

  a AUTHENTICATE NTLM  // +
  <type_1_msg>  // + <type_2_msg>
  <type_3_msg> // a OK [REFERRAL imap://;AUTH=*@exchangeServer2.domain.com/] AUTHENTICATE completed.
  b select inbox // b NO [REFERRAL imap://;AUTH=*@exchangeServer2.domain.com/inbox] There is no replica for that mailbox on this server."
  c select mailboxalias //c NO There is no replica for that mailbox on this server.
  d select mailboxalias/inbox //d NO There is no replica for that mailbox on this server.
  e select inbox/mailboxalias //e NO There is no replica for that mailbox on this server.

当前上下文用户邮箱存储在 exchangeserver2 中,但共享邮箱在 exchangeserver1 中,这就是为什么在 NTLM 中您会看到 REFERRAL 部分,但在上述两种情况下,我都连接到 exchangeserver1。

我尝试了几种select带有“邮箱别名”和“收件箱”的命令变体,但都没有奏效。我确实可以访问邮箱,我是它的所有者,我可以从 Outlook(但我相信它使用 MAPI)和“基本身份验证”访问它。

认证后,如何选择共享邮箱收件箱?

我正在使用以下 AcquireCredentialsHandle 调用来生成 NTLM 类型 1 消息:AcquireCredentialsHandle (null, "NTLM", 2, 0, 0, 0, 0, ref phCredential, ref ptsExpiry)

我什至尝试将第一个参数(将是用户名)从 null(当前上下文用户)更改为“域/用户名/邮箱”,但它不起作用。

谢谢 :)

4

0 回答 0