错误:此类型的 oauth 令牌必须存在 ExchangeImpersonation SOAP 标头

zam*_*4ik 5 exchangewebservices oauth-2.0

我正在尝试将 Exchange Web 服务 (EWS) 与应用程序和 OAuth2 身份验证结合使用。

\n\n

我做了什么:

\n\n
    \n
  • 在 Azure 门户应用程序上注册,授予所有必需的权限(甚至full_access_as_app对于 Exchange);作为管理员接受这些权限;
  • \n
  • 准备正确的 OAuth2 Bearer 令牌(具有范围https://outlook.office365.com/.default);
  • \n
  • 使用 SOAP UI 准备 SOAP 请求。作为此请求的基础,我使用以下一个: https: //learn.microsoft.com/en-us/exchange/client-developer/web-service-reference/getattachment-operation。此外,我还添加了带有不记名令牌的 HTTP 授权标头、带有目标邮箱的 X-AnchorMailbox。
  • \n
\n\n

结果我得到这个:“这种类型的 OAuth 令牌必须存在 ExchangeImpersonation SOAP 标头”。我不明白我应该做什么来解决它。

\n\n

即使尝试使用与上面相同的邮箱地址的 ExchangeImpersonate 和 SmtpAddress,但这样我会收到另一个错误“找不到邮箱”。但邮箱是!(在多个邮箱上测试)。

\n\n

我的问题是:我对 EWS 做错了什么?

\n\n

要求:

\n\n
POST\xc2\xa0https://outlook.office365.com/ews/Exchange.asmx\nAuthorization:\xc2\xa0Bearer\xc2\xa0<token>\nX-AnchorMailbox:\xc2\xa0mailbox@something.onmicrosoft.com\n\n\n<?xml version="1.0" encoding="utf-8"?>\n<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\nxmlns:xsd="http://www.w3.org/2001/XMLSchema"\nxmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"\nxmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">\n\xc2\xa0\xc2\xa0<soap:Header>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0<t:RequestServerVersion Version="Exchange2016"/>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0<t:ExchangeImpersonation>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0<t:ConnectingSID>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0<t:PrimarySmtpAddress>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0mailbox@something.onmicrosoft.com\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0</t:PrimarySmtpAddress>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0</t:ConnectingSID>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0</t:ExchangeImpersonation>\n\xc2\xa0\xc2\xa0</soap:Header>\n\xc2\xa0\xc2\xa0<soap:Body>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0<GetAttachment xmlns="http://schemas.microsoft.com/exchange/services/2006/messages"\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0<AttachmentShape/>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0<AttachmentIds>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0<t:AttachmentId Id="AAMkADAwNzdjNTg3LTc4M2ItNDE0Yi05MTk4LTQxZDBlYTc1NmMxZgBGAAAAAAAiixtLGariQY7rf5pAKRZZBwBVk8babsuEQ4s2Znfj9fB5AAAAAAEMAABVk8babsuEQ4s2Znfj9fB5AADq3B14AAABEgAQAKZOAcjZCBxHpqvY6XmXp5w="/>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0</AttachmentIds>\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0</GetAttachment>\n\xc2\xa0\xc2\xa0</soap:Body>\n</soap:Envelope>\n
Run Code Online (Sandbox Code Playgroud)\n\n

回复:

\n\n
ErrorNonExistentMailbox\xc2\xa0The SMTP address has no mailbox associated with it.\n
Run Code Online (Sandbox Code Playgroud)\n

小智 9

这为我解决了这个问题。

_exchangeService.ImpersonatedUserId = 
    new ImpersonatedUserId(ConnectingIdType.SmtpAddress, userEmailAddress);
Run Code Online (Sandbox Code Playgroud)

  • 更多上下文会让这个答案变得更好!你把这段代码放在哪里? (6认同)

Anu*_*ugh 0

您需要实例化模拟,如下所示:

var ews = new Rebex.net.Ews();
ews.Connect(outlook.office365.com);
ews.Settings.Impersonation = new EwsImpersonation();
ews.Settings.Impersonation.SmtpAddress = <mailbox address>;
Run Code Online (Sandbox Code Playgroud)