当前位置: 首页 > 知识库问答 >
问题:

如何在Azure函数中使用Azure托管标识通过触发器访问服务总线?

洪博涛
2023-03-14

我在Azure中创建了一个ServiceBus命名空间,以及一个主题和一个订阅。我还有一个简单的Azure version 1函数,可在ServiceBus中的接收主题上触发,如下所示:

[FunctionName("MyServiceBusTriggerFunction")]
public static void Run([ServiceBusTrigger("myTopic", "mySubscription", Connection = "MyConnection")]string mySbMsg, TraceWriter log)
{
    log.Info($"C# ServiceBus topic trigger function processed message: {mySbMsg}");
}

当我通过使用主题的共享访问策略在函数应用程序设置中定义连接字符串时,该函数会很好地触发ServiceBus中的主题,如下所示:

Endpoint=sb://MyNamespace.servicebus.windows.net/;SharedAccessKeyName=mypolicy;SharedAccessKey=UZ...E0=

现在,我想使用托管服务标识(MSI)来访问服务总线,而不是共享访问密钥。根据这个(https://docs.microsoft.com/en-us/azure/active-directory/managed-service-identity/services-support-msi)这应该是可能的,除非我误解了什么。不过,我还没有设法让它工作。

我尝试的是

  • 在Azure门户中为我的函数设置托管服务标识开
  • 在Azure Portal的ServiceBus访问控制部分中为函数指定Owner角色
  • 设置MyFunction的连接字符串如下:Endpoint=sb://MyNamespace.servicebus.windows.net/

该功能在此设置中未触发,因此我遗漏了什么或我做错了什么?如果有任何建议能帮助我走得更远,我将不胜感激。谢谢

共有3个答案

孙熠彤
2023-03-14

更新Microsoft。天青。Web工作。扩展。ServiceBus版本5. x

现在这里有一个最新版本包的官方文档。

{
  "Values": {
    "<connection_name>__fullyQualifiedNamespace": "<service_bus_namespace>.servicebus.windows.net"
  }
}

以前的回答:

这实际上现在似乎是可能的,至少对我来说效果不错。您需要使用此连接字符串

Endpoint=sb://service-bus-namespace-name.servicebus.windows.net/;Authentication=ManagedIdentity

实际上,我在微软网站上还没有找到任何关于这方面的文档,但在这里的一个博客中。

Microsoft确实留档了您可以使用的角色,以及如何将它们限制在此处的范围内。示例:

az role assignment create \
    --role $service_bus_role \
    --assignee $assignee_id \
    --scope /subscriptions/$subscription_id/resourceGroups/$resource_group/providers/Microsoft.ServiceBus/namespaces/$service_bus_namespace/topics/$service_bus_topic/subscriptions/$service_bus_subscription
壤驷文华
2023-03-14

同意从azure功能我们不能直接访问ASB之类的资源。但是,在本例中,仍然不需要直接在connectionstring中输入密码“SharedAccessKeyName”。Azure功能可以与Azure KeyVault配合使用。因此,您可以将带有敏感信息的连接字符串作为机密存储在KeyVault中,然后通过KeyVault授予azure功能的系统分配标识访问权限,然后将门户中的设置值指定为@Microsoft。KeyVault(SecretUri={theSecretUri})关于如何实现上述功能的详细信息在下面的博客中提到。https://medium.com/statuscode/getting-key-vault-secrets-in-azure-functions-37620fd20a0b

这仍将避免直接在Azure函数中指定connectionstring,并提供通过Vault的单点访问,以防出现安全漏洞

尚声
2023-03-14

我错过了什么或者我做错了什么?

您可能会混淆MSI和共享访问策略。他们使用不同的提供商访问Azure servicebus。您可以只使用connectionstring或只使用MSI进行身份验证。

使用托管服务标识(MSI)进行身份验证时,需要使用以下代码为托管服务标识创建令牌提供程序。

令牌提供程序。CreateManagedService鉴定令牌提供者(ServiceAudience.ServiceBusAudience)

此TokenProvider的实现使用Microsoft中的AzureServiceTokenProvider。蔚蓝色的服务。AppAuthentication库AzureServiceTokenProvider将根据环境采用一系列不同的方法来获取访问令牌。然后初始化客户端以操作servicebus。有关更多详细信息,请参阅本文。

当您使用servicebus connectionstring来访问它时,请使用共享访问令牌(SAS)令牌提供程序,以便您可以直接操作。

 类似资料:
  • 我已经尝试按照本教程来验证我的服务总线对,但是,我得到了401。 我在设置中使用以下代码: 然后我这样称呼SB客户: 当我调用我得到一个401错误: 失败:Azure Messaging ServiceBus[82]为标识符myqueue-578624f3-f732-4a9b-2ab0-9adc01949a5a创建发送链接时发生异常。错误消息:“系统。UnauthorizedAccessExcep

  • 有没有办法将Azure托管标识与LinuxVM一起使用来访问AzureSQL数据库?我只能找到这个文档https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/tutorial-windows-vm-access-sql它专门针对Windows VM。Linux机器是否有文档

  • 当尝试在Azure Gov中获取服务总线的托管标识令牌时,我尝试使用资源:https://servicebus.usgovcloudapi.net/而不是像商业(https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-managed-service-identity)那样https://servicebus.

  • 我正在尝试将托管标识与Azure功能V3和QueueTrigger一起使用。功能代码的定义如下: 根据微软留档这应该是可能的通过定义一些额外的配置属性 https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference?tabs=blob#local-development-with-identity-based-c

  • 在.NET core 2.0中使用创建时,我遇到了一个问题。 在体系结构中,当在用于创建用户的队列中创建新消息时,服务必须接收该消息并根据其中的信息在数据库中创建用户。 在Visual Studio2017中,我在下创建了一个新项目。 这种的正确实现是什么?在GitHub上有什么例子吗?提前道谢。

  • 我试图使用托管标识从API管理实例调用Azure函数。我已为我的APIM实例设置了系统管理的标识。我已将参与者角色授予Azure Function应用程序上的此身份。我还将应用程序服务身份验证更改为AD。 现在我尝试从API调用该函数。 我有两个问题: 第一个:当我使用身份验证管理身份策略来获取令牌时,我得到了一个错误,当我使用受众https://myfunctionapp.azurewebsit