编辑此问题于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)未经授权。
一开始,我已经使用共享访问策略设置了我的连接字符串,该策略只允许侦听队列并将其更改为“管理”声明但我仍然有此错误。
要解决此问题,我必须与RootManageSharedAccessKey建立连接,以便提供对服务总线命名空间的完全访问权限
这是正常/期望的行为吗?将来是否可以使用不同的共享访问策略设置连接字符串?
答案 0 :(得分:3)
如果未指定,则使用的默认AccessRights
为AccessRights.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已经移动了一些东西。有关指导,请转到服务总线的命名空间(搜索服务总线,然后选择您的命名空间),然后选择共享访问策略。在那里你应该找到你的共享访问密钥,你可以将这个服务总线值复制到你的应用程序配置中(小心并注意实际生产密钥的源代码安全性....)我的共享密钥已设置为管理发送听着,我只是把它复制错了......