【问题标题】:ServiceBus Queue Trigger For Azure Function: Manage claim is required for this operationAzure 函数的 ServiceBus 队列触发器:此操作需要管理声明
【发布时间】:2019-01-30 19:13:58
【问题描述】:

编辑此问题写于 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) Unauthorized。此操作需要管理声明。 TrackingId:6e27fe40-f667-4230-9995-d09f2ac67f35_G17,时间戳:2016 年 4 月 18 日晚上 10:17:41。系统:远程服务器返回错误:(401) Unauthorized.

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    我们还需要通过一流的门户 UI 公开此值,以使其更易于配置。

    【讨论】:

    • Matthew,accessRights 设置的目的是什么?使用网络作业,我们不需要指定任何类似的东西来配置服务总线触发器。
    • 是的,这也存在于核心SDK中。 ServiceBusAttribute 有一个可以配置的 AccessRights 属性。这个设置只是映射到那个。我们在上一个 WebJobs SDK 版本中添加了这一点,因为人们希望能够使用有限访问的连接字符串。以前我们总是假设我们有Manage,我们会尝试会失败的操作。
    • 谢谢,我会看看 ^^ 我注意到这只能使用以全局服务总线命名空间为目标的连接字符串。如果我指定一个仅针对特定队列的连接字符串,它将失败。未来会发生变化吗?
    【解决方案2】:

    使用自定义 AccessRights 值声明您以这种方式触发函数:

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

    【讨论】:

      【解决方案3】:

      我的解决方案稍微简单一些,我采用了将 app.config 文件与存储在设置中的 ServiceBus 的 connectionString 一起使用的方法:

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

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

      【讨论】:

      • 怎么有人决定否决这个?这是一个真正的答案,解决了我的问题。请至少评论一下你为什么投了反对票。谢谢。
      • 再来一次?即使它回答了我自己的问题,还是投了反对票??
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-01
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多