通过应用服务计划上的 azure 功能使用托管身份连接到 Azure SQL

问题描述 投票:0回答:1

我现在的情况是这样的:

  • 我创建了一个功能应用程序“func-test-01”(托管在应用程序服务计划上),并且它通过应用程序注册“appr-func-test-01”启用了身份验证
  • 我已经在其上部署了一个带有 HTTP 触发器和身份验证“函数”的 azure 函数 部署后,我为函数应用程序创建了系统分配的托管标识(其名称与函数应用程序相同,因此 func-test-01)
  • azure 函数应该在通过 http 正文提供的数据库上创建用户。为此,使用以下架构创建连接字符串: $"Server={data.ServerName}.database.windows.net,1433;Authentication=Active Directory Managed Identity;Database={data.DatabaseName}";这应该利用托管身份(我想)。

要致电 AZF:

  • 我首先使用 appr-func-test-01 凭证生成一个令牌
  • 准备带有不记名身份验证的 azure 函数调用标头和生成的令牌
  • 使用关键函数调用azure函数端点,提供标头和必要的正文

调用似乎工作正常(该函数是可调用的)

问题出在azure函数内部。

为了能够执行用户创建任务,我需要在每个数据库上创建“func-test-01”用户(函数应用托管标识)!

如果我在目标数据库上执行此操作:

CREATE USER [func-test-01] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [func-test-01];
ALTER ROLE db_datawriter ADD MEMBER [func-test-01];
GO
GRANT CONTROL TO [func-test-01]
GO

并调用azure函数,它按预期工作。

到目前为止一切顺利,但我们有很多数据库,并计划将托管身份(“func-test-01”)添加到 AAD 组,该组是托管数据库的服务器的所有者:如果我执行此操作,并删除来自数据库的托管身份用户,我收到一条错误消息,指出服务主体(管理身份)无法连接到数据库!

另一方面,如果我创建另一个带有消费计划的功能应用程序,无需身份验证,如果我遵循上述相同步骤(部署,创建系统分配的 mi,并将其注册为服务器所有者组的成员),它无需创建数据库用户即可工作:我缺少什么?

azure azure-active-directory azure-functions
1个回答
0
投票

最终我能够让这个基础设施运行起来,但有一些注意事项:

  1. 我已经从应用程序注册“appr-func-test-01”创建了一个服务主体
  2. 我已将服务主体添加到数据库管理 AAD 组作为托管标识 func-test-01
  3. 最重要的是:您需要停止并重新启动函数应用程序。据我了解,当azure函数尝试使用manageg身份连接到数据库时,它会要求提供令牌。此令牌在下一次询问之前保持有效(或无效),因此如果在请求时 azure 函数无法连接,则除非您允许并重新启动函数应用程序,否则它仍然无法连接。
© www.soinside.com 2019 - 2024. All rights reserved.