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



我在Azure中创建了一个ServiceBus命名空间,以及一个主题和一个订阅。我还有一个简单的 Azure 版本 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( 来访问 ServiceBus,而不是共享访问密钥。根据这个(https://learn.microsoft.com/en-us/azure/active-directory/managed-service-identity/services-support-msi(,除非我误解了什么,否则应该是可能的。不过,我还没有设法让它工作。

我尝试的是

  • 在 Azure 门户中为我的函数设置托管服务标识"开">
  • 在 Azure 门户的服务总线访问控制部分中为函数提供所有者角色
  • 为 MyFunction 设置连接字符串,如下所示:Endpoint=sb://MyNamespace.servicebus.windows.net/

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

Microsoft.Azure.WebJobs.Extensions.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文档,而是在此处的博客中找到。

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

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

你可能会与 MSI 和共享访问策略混淆。它们使用不同的提供程序来访问 Azure 服务总线。可以只使用连接字符串,也可以只使用 MSI 进行身份验证。

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

TokenProvider.CreateManagedServiceIdentityTokenProvider(ServiceAudience.ServiceBusAudience).

令牌提供程序的实现使用在Microsoft.Azure.Services.AppAuthentication库中找到的AzureServiceTokenProviderAzureServiceTokenProvider将遵循一定数量的不同方法(具体取决于环境(来获取访问令牌。然后初始化客户端以操作服务总线。 有关更多详细信息,您可以参考本文。

使用服务总线连接字符串访问哪个时,使用共享访问令牌 (SAS( 令牌提供程序,以便可以直接操作。

同意从 azure 函数中我们不能像 ASB 那样直接访问资源。但是,在这种情况下,仍然不需要直接在连接字符串中输入密码"共享访问密钥名称"。 Azure 函数可以与 Azure KeyVault 配合使用。因此,可以将包含敏感信息的连接字符串作为机密存储在 KeyVault 中,然后通过 KeyVault 授予来自 azure 函数的系统分配标识访问权限,然后将门户中设置的值指定为@Microsoft.KeyVault(SecretUri={theSecretUri}(有关如何实现上述目标的详细信息,请参阅以下博客。 https://medium.com/statuscode/getting-key-vault-secrets-in-azure-functions-37620fd20a0b

这仍将避免直接在 Azure 函数中指定连接字符串,并提供通过保管库的单点访问,以便在发生安全漏洞时禁用

最新更新