2017-08-16 107 views
0

我正尝试使用REST API更新Azure服务总线订阅。使用REST API更新Azure服务总线订阅时获取“授权失败(401)”

当我在请求XML中包含"ForwardTo"属性时,出现Service Bus中的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的为例),有也有很多特性方便地忽略了:(。

有趣的是,我通过服务总线资源管理器(它使用的.Net进行同样的操作SDK),那里的操作工作正常。我使用HTTP协议连接到我的Service Bus帐户,并通过Fiddler跟踪请求/响应,并且我的请求和服务总线浏览器发送的请求大致相同(它发送一些额外的参数,我没有包括在我的请求)

此外,服务总线并没有给我任何关于错误的更多细节,只有我从那里得到的是:

{ 
    "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元素的顺序)。

任何对此的见解将不胜感激。

+0

我在使用c#管理库for servicebus之前完成了这个工作(只需注意它可以完成) –

+0

看起来我只是使用路径:https://github.com/s-innovations/MessageProcessor.ServiceFabric/斑点/主/ SRC/ServiceFabric。QueueManagerActor/Actors/DispatcherManagerActor.cs#L132而不是完整的命名空间uri –

+1

谢谢!我查看了.Net SDK代码,如果您只是指定路径,SDK会将Service Bus URI假装为路径。 –

回答

0

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

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

这些授权标头的计算方式与常规请求授权标头相同,只有一点小差异。计算这些请求标头所需的URL分别为ServiceBusSupplementaryAuthorizationServiceBusDlqSupplementaryAuthorization标头的ForwardToForwardDeadLetteredMessagesTo属性的值。

相关问题