获得"授权失败(401)"使用REST API更新Azure Service Bus订阅时

时间:2017-08-16 16:08:09

标签: azure azureservicebus azure-servicebus-topics

我正在尝试使用REST API更新Azure Service Bus订阅。

当我在请求XML中包含"ForwardTo"属性时,我从服务总线收到Authorization Failure (401)错误。

这是我的XML请求:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
  <entry xmlns="http://www.w3.org/2005/Atom">
    <content type="application/xml">
      <SubscriptionDescription xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect">
        <LockDuration>PT1M</LockDuration>
        <RequiresSession>false</RequiresSession>
        <DefaultMessageTimeToLive>P10675199DT2H48M5.4775807S</DefaultMessageTimeToLive>
        <DeadLetteringOnMessageExpiration>false</DeadLetteringOnMessageExpiration>
        <DeadLetteringOnFilterEvaluationExceptions>true</DeadLetteringOnFilterEvaluationExceptions>
        <MessageCount>1</MessageCount>
        <MaxDeliveryCount>10</MaxDeliveryCount>
        <EnableBatchedOperations>true</EnableBatchedOperations>
        <Status>Active</Status>
      <ForwardTo>sb://namespacename.servicebus.windows.net/t200</ForwardTo>
        <CreatedAt>2017-08-14T16:17:15.308721Z</CreatedAt>
        <UpdatedAt>2017-08-16T15:33:03.0317963Z</UpdatedAt>
        <AccessedAt>2017-08-16T11:29:37.993Z</AccessedAt>
        <AutoDeleteOnIdle>P10675199DT2H48M5.4775807S</AutoDeleteOnIdle>
        </SubscriptionDescription>
    </content>
  </entry>

但是,如果我删除&#34; ForwardTo&#34;来自请求XML的节点,一切都很好。

我也查看了Service Bus REST API文档,遗憾的是文档非常不完整。它没有提供关于如何制作XML请求有效负载的任何示例。

我甚至查看了其他SDK(例如Python),还有很多属性被忽略了:(。

有趣的是,我通过Service Bus Explorer(使用.Net SDK)执行了相同的操作,操作正常。我使用HTTP协议连接到我的Service Bus帐户,并通过Fiddler跟踪请求/响应,我的请求和Service Bus Explorer发送的请求大致相同(它发送了一些额外的参数,我在请求中没有包含这些参数) )。

此外,Service Bus没有向我提供有关错误的更多详细信息。我从那里得到的只有:

{
    "statusCode": 401,
    "baseError": null,
    "headers": {
        "transfer-encoding": "chunked",
        "content-type": "application/xml; charset=utf-8",
        "server": "Microsoft-HTTPAPI/2.0",
        "strict-transport-security": "max-age=31536000",
        "date": "Wed, 16 Aug 2017 15:41:33 GMT",
        "connection": "close"
    }
}

我在这里完全失去了可能导致此错误的原因。

我知道Service Bus REST API对于XML元素应该出现在请求体中的顺序非常挑剔,据我所知,排序是正确的(但是我可能会错,因为我没有&#39 ; t有任何参考文件来比较我的请求机构。)

当我改变&#34; ForwardTo&#34;的顺序时节点,我没有收到任何错误,但是忽略了这个属性(因为请求体中XML元素的顺序)。

对此的任何见解都将受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

在Azure Service Bus产品团队的帮助下,我能够解决此问题。

基本上,请求需要包含2个额外的标头:ServiceBusSupplementaryAuthorizationServiceBusDlqSupplementaryAuthorization。如果为队列设置了ForwardTo属性,则需要第一个标头。如果为队列设置了ForwardDeadLetteredMessagesTo属性,则需要第二个标头。如果未在队列中设置这些属性,则不应存在这些标头。

这些授权标头的计算方式与常规请求授权标头的计算方式略有不同。计算这些请求标头所需的网址分别是ForwardToForwardDeadLetteredMessagesTo标头的ServiceBusSupplementaryAuthorizationServiceBusDlqSupplementaryAuthorization属性值。