使用 REST API 更新 Azure 服务总线订阅时获取 "Authorization Failure (401)"
Getting "Authorization Failure (401)" when updating an Azure Service Bus Subscription using REST API
我正在尝试使用 REST API 更新 Azure 服务总线订阅。
当我在我的请求 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>
但是,如果我从请求 XML 中删除 "ForwardTo" 节点,一切正常。
我也查看了 Service Bus REST API 文档,不幸的是文档非常不完整。它没有提供任何关于如何制作 XML 请求负载的示例。
我什至查看了其他 SDK(例如 Python),还有很多属性被方便地忽略了 :(.
有趣的是,我通过 Service Bus Explorer(使用 .Net SDK)执行了相同的操作,并且操作正常。我使用 HTTP 协议连接到我的服务总线帐户并通过 Fiddler 跟踪 request/response,我的请求和服务总线资源管理器发送的请求或多或少相同(它发送了一些我没有包含在中的额外参数我的请求)。
此外,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"
}
}
对于可能导致此错误的原因,我完全不知所措。
我知道服务总线 REST API 对 XML 元素出现在请求正文中的顺序非常挑剔,据我所知,顺序是正确的(但是我可能又错了,因为我没有任何参考文件来比较我的请求正文)。
当我更改 "ForwardTo" 节点的顺序时,我没有收到任何错误,但是此 属性 被忽略(因为请求中 XML 元素的顺序正文)。
如果您对此有任何见解,我们将不胜感激。
在 Azure 服务总线产品团队的帮助下,我解决了这个问题。
基本上,请求需要包含 2 个额外的 header:ServiceBusSupplementaryAuthorization
和 ServiceBusDlqSupplementaryAuthorization
。如果为 queue 设置 ForwardTo
属性,则首先需要 header。如果为 queue 设置了 ForwardDeadLetteredMessagesTo
属性,则需要第二个 header。如果未在 queue.
上设置这些属性,则不应存在这些 header
这些授权 header 的计算方式与您的常规请求授权 header 相同,只有一点点不同。计算这些请求 header 所需的 URL 是 ForwardTo
和 ForwardDeadLetteredMessagesTo
属性的值 ServiceBusSupplementaryAuthorization
和 ServiceBusDlqSupplementaryAuthorization
header分别是.
我正在尝试使用 REST API 更新 Azure 服务总线订阅。
当我在我的请求 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>
但是,如果我从请求 XML 中删除 "ForwardTo" 节点,一切正常。
我也查看了 Service Bus REST API 文档,不幸的是文档非常不完整。它没有提供任何关于如何制作 XML 请求负载的示例。
我什至查看了其他 SDK(例如 Python),还有很多属性被方便地忽略了 :(.
有趣的是,我通过 Service Bus Explorer(使用 .Net SDK)执行了相同的操作,并且操作正常。我使用 HTTP 协议连接到我的服务总线帐户并通过 Fiddler 跟踪 request/response,我的请求和服务总线资源管理器发送的请求或多或少相同(它发送了一些我没有包含在中的额外参数我的请求)。
此外,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"
}
}
对于可能导致此错误的原因,我完全不知所措。
我知道服务总线 REST API 对 XML 元素出现在请求正文中的顺序非常挑剔,据我所知,顺序是正确的(但是我可能又错了,因为我没有任何参考文件来比较我的请求正文)。
当我更改 "ForwardTo" 节点的顺序时,我没有收到任何错误,但是此 属性 被忽略(因为请求中 XML 元素的顺序正文)。
如果您对此有任何见解,我们将不胜感激。
在 Azure 服务总线产品团队的帮助下,我解决了这个问题。
基本上,请求需要包含 2 个额外的 header:ServiceBusSupplementaryAuthorization
和 ServiceBusDlqSupplementaryAuthorization
。如果为 queue 设置 ForwardTo
属性,则首先需要 header。如果为 queue 设置了 ForwardDeadLetteredMessagesTo
属性,则需要第二个 header。如果未在 queue.
这些授权 header 的计算方式与您的常规请求授权 header 相同,只有一点点不同。计算这些请求 header 所需的 URL 是 ForwardTo
和 ForwardDeadLetteredMessagesTo
属性的值 ServiceBusSupplementaryAuthorization
和 ServiceBusDlqSupplementaryAuthorization
header分别是.