oauth2.0 Exchange(EWS SOAP)使用模拟获取文件夹返回500 -无效请求

kxxlusnw  于 2023-04-29  发布在  其他
关注(0)|答案(1)|浏览(162)

我正在尝试用SOAP调用EWS,并将旧的Legacy Auth代码替换为OAuth。但我总是得到一个“500 -请求无效。”
我能够得到一个令牌与c#和nugets“微软。客户端”和“微软。Exchange.WebServices”。它可以列出我的文件夹在我的邮箱,我可以得到电子邮件在这些文件夹。

但是我不能使用C#应用程序,因为我们的应用程序是在Access(VBA)中,代码耦合到SOAP的逻辑。5-10年前制作应用程序的人不记得应用程序的逻辑,现在需要数据。..
我可以使用的是这个小概念证明中的访问令牌。所以,我试着使用我从微软得到的访问令牌。客户端并将其添加到VBA调用中,它似乎可以工作,因为我没有得到401/403。最初我有401,因为我没有正确的权限在Azure上,但现在似乎没事了。
就像在c#代码中一样,我将Impersonation添加到SOAP请求中,以保持与c#代码相同。
下面是SOAP请求

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types"
>
  <soap:Header>
    <t:ExchangeImpersonation>
      <t:ConnectingSID>
        <t:PrimarySmtpAddress>
          my-email@my-business-domaine.com
        </t:PrimarySmtpAddress>
      </t:ConnectingSID>
    </t:ExchangeImpersonation>
  </soap:Header>
  <soap:Body>
    <GetFolder xmlns="https://schemas.microsoft.com/exchange/services/2006/messages"
               xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
      <FolderShape>
        <t:BaseShape>Default</t:BaseShape>
      </FolderShape>
      <FolderIds>
        <t:DistinguishedFolderId Id="inbox"/>
      </FolderIds>
    </GetFolder>
  </soap:Body>
</soap:Envelope>

服务不是很详细,所以我不知道请求中有什么问题!

<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Header>
      <Action xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none" s:mustUnderstand="1">*</Action>
   </s:Header>
   <s:Body>
      <s:Fault>
         <faultcode xmlns:a="http://schemas.microsoft.com/exchange/services/2006/types">a:ErrorInvalidRequest</faultcode>
         <faultstring xml:lang="en-US">The request is invalid.</faultstring>
         <detail>
            <e:ResponseCode xmlns:e="http://schemas.microsoft.com/exchange/services/2006/errors">ErrorInvalidRequest</e:ResponseCode>
            <e:Message xmlns:e="http://schemas.microsoft.com/exchange/services/2006/errors">The request is invalid.</e:Message>
         </detail>
      </s:Fault>
   </s:Body>
</s:Envelope>

为了进行测试,我在这里使用了GetFolder服务的XML的主要部分

https://learn.microsoft.com/en-us/exchange/client-developer/web-service-reference/getfolder-operation

我已经找到了要添加的标题

https://learn.microsoft.com/en-us/exchange/client-developer/exchange-web-services/how-to-identify-the-account-to-impersonate

与C#请求相比,这个请求有什么问题?
他们使用相同的访问令牌,尝试执行相同的操作。但是SOAP调用失败了。

vktxenjb

vktxenjb1#

如果您从Microsoft文档中提取了示例,则您的架构不正确,这就是问题所在。例如

<soap:Envelope 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types"
>

<GetFolder xmlns="https://schemas.microsoft.com/exchange/services/2006/messages"
           xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">

应该是

<soap:Envelope 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
>

<GetFolder xmlns="http://schemas.microsoft.com/exchange/services/2006/messages"
           xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">

EWS中的XML模式始终是http而不是https(请注意,这只是一个模式声明,与实际使用的协议无关),Microsoft通过错误地更新其文档中的模式值在其Exchange文档中创建了一个问题。我已经修复了其中的一些,因为我发现他们,但有很多问题。

相关问题