Azure功能的ServiceBus队列触发器:此操作需要管理声明

时间:2016-04-18 22:32:33

标签: c# azureservicebus azure-servicebus-queues azure-functions

编辑此问题于2016年撰写,因此可能不再相关

我刚刚创建了一个简单的功能应用程序,其中有一个功能应该在新的消息添加到队列时触发(门户内功能)

我使用了" ServiceBusQueueTrigger - C#"模板来创建我的函数,所以代码看起来像这样:

using System;
using System.Threading.Tasks;

public static void Run(string myQueueItem, TraceWriter log)
{
    log.Verbose($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
}

在Azure门户网站上,我发现了这个错误:

  

Microsoft.ServiceBus:远程服务器返回错误:(401)未经授权。此操作需要管理声明。 TrackingId:6e27fe40-f667-4230-9995-d09f2ac67f35_G17,TimeStamp:4/18/2016 10:17:41 PM。系统:远程服务器返回错误:(401)未经授权。

Azure Function Error - (401) Unauthorized - Manage claim is required for this operation.

一开始,我已经使用共享访问策略设置了我的连接字符串,该策略只允许侦听队列并将其更改为“管理”声明但我仍然有此错误。

要解决此问题,我必须与RootManageSharedAccessKey建立连接,以便提供对服务总线命名空间的完全访问权限

这是正常/期望的行为吗?将来是否可以使用不同的共享访问策略设置连接字符串?

3 个答案:

答案 0 :(得分:3)

如果未指定,则使用的默认AccessRightsAccessRights.Manage。您可以使用高级门户网站编辑器覆盖它,指定更受限制的AccessRights值:

{
  "bindings": [
    {
      "type": "serviceBusTrigger",
      "direction": "in",
      "accessRights": "listen",
      "queueName": "samples-input"
    }
  ]
}

我们需要通过一流的门户网站UI公开这个值,以便更容易配置。

答案 1 :(得分:1)

用自定义的AccessRights值声明您以此方式触发的函数:

    public async Task MyFunction([ServiceBusTrigger(MyQueueName, Microsoft.ServiceBus.Messaging.AccessRights.Listen)] Message message, TextWriter log)

答案 2 :(得分:-1)

我的解决方案有点简单,我采用了一个app.config文件的方法,其中一个connectionString存储在我的ServiceBus设置中:

<add name="AzureWebJobsServiceBus" value="e.t.c."/>

我在服务总线值中输入了错误的值。在找到这些东西的地方并不是很明显,因为自从我上次看之后,Azure已经移动了一些东西。有关指导,请转到服务总线的命名空间(搜索服务总线,然后选择您的命名空间),然后选择共享访问策略。在那里你应该找到你的共享访问密钥,你可以将这个服务总线值复制到你的应用程序配置中(小心并注意实际生产密钥的源代码安全性....)我的共享密钥已设置为管理发送听着,我只是把它复制错了......