SharedAccessAuthorizationRule和GetQueues正在跨越“队列边界”

时间:2017-04-17 17:25:01

标签: azureservicebus servicebus azure-servicebus-queues

我有Service Bus 1.1。在前提下。但那部分可能并不重要。

我为我的队列设置了SharedAccess安全性。每个队列都分配了一个SharedAccessKey

代码看起来像这样:

/* \packages\WindowsAzure.ServiceBus.2.1.4.0\lib\net40-full\Microsoft.ServiceBus.dll */
using Microsoft.ServiceBus;
using Microsoft.ServiceBus.Messaging;

ServiceBusConnectionStringBuilder sbcsb = /* not shown */;
NamespaceManager nsm = new NamespaceManager(sbcsb.GetAbsoluteManagementEndpoints(), tp);                        
QueueDescription currentQueueDescription = new QueueDescription("MyQueueOne");
currentQueueDescription.SupportOrdering = false;
currentQueueDescription.LockDuration = "1000";

ICollection<AccessRights> accessRightsCollection = new List<AccessRights> { AccessRights.Listen, AccessRights.Manage, AccessRights.Send };

string currentRandomKeyName = "MyListenManageSendKeyName" + Guid.NewGuid().ToString("N");
string currentRandomKeyValue = SharedAccessAuthorizationRule.GenerateRandomKey();                       

currentQueueDescription.Authorization.Add(new SharedAccessAuthorizationRule(currentRandomKeyName, currentRandomKeyValue, accessRightsCollection.ToArray()));                       

nsm.CreateQueue(currentQueueDescription);

假设我创建了3个队列:

MyQueueOne
KeyName = MyListenManageSendKeyName11111111111111111111111111111111
KeyValue = abc1230000000000000000000000000000000000000

(code not shown, but same idea as the above)

MyQueueTwo
KeyName = MyListenManageSendKeyName22222222222222222222222222222222
KeyValue = def4560000000000000000000000000000000000000

MyQueueThree
KeyName = MyListenManageSendKeyName33333333333333333333333333333333
KeyValue = ghi7890000000000000000000000000000000000000

稍后,我将代码调用到GetAllQueues。

如下所示。请注意,我使用的是共享密钥访问,最初是为MyQueueOne创建的。

string currentKeyName = "MyListenManageSendKeyName11111111111111111111111111111111";
string currentKeyValue = "abc1230000000000000000000000000000000000000"; 

ServiceBusConnectionStringBuilder sbcsb = /* not shown */

TokenProvider tp = TokenProvider.CreateSharedAccessSignatureTokenProvider(currentKeyName, currentKeyValue);

NamespaceManager nsm = new NamespaceManager(sbcsb.GetAbsoluteManagementEndpoints(), tp);

IEnumerable<QueueDescription> allQueues = nsm.GetQueues();

当我调用.GetAllQueues()方法时,我会回来

MyQueueOne
MyQueueTwo
MyQueueThree

这是预期的行为吗?

在我有限的观点中,该特定密钥只会带回MyQueueOne。

我能做些什么才能找回“属于”特定SharedAccessAuthorizationRule的队列吗?

1 个答案:

答案 0 :(得分:1)

  

这是预期的行为吗?在我的有限观点中,该特定密钥只会带回MyQueueOne

不,如果我们使用MyQueueOne共享密钥访问来获取队列列表,那么将得到401错误。我相信如果我们想要列出队列,我们​​需要使用默认的 RootManageSharedAccessKey 。我还会使用您的代码对其进行测试,并在尝试GetAllQueues时收到401错误。

enter image description here

如果我使用了 RootManageSharedAccessKey ,那么你可以提到结果。

enter image description here

  

我能做些什么才能找回“属于”特定SharedAccessAuthorizationRule的队列吗?

如果想获得特定的SharedAccessAuthorizationRule,我们需要使用 RootMangeSharedAccesskey 生成TokenProvider,然后过滤我们想要的结果,以下是我的测试代码和结果。

TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", "xxxxxx");
IEnumerable<QueueDescription> allQueues = nsm.GetQueues().Where(queue=>queue.Authorization.Count(auth => auth.KeyName.Equals(currentKeyName))>0);

enter image description here