Azure Functions 提供了一个托管标识,它是用于保护对 Azure SQL 数据库和其他 Azure 服务的访问的统包解决方案。 托管标识通过消除应用程序中的机密信息(例如连接字符串中的凭据),使应用程序更加安全。 在这个教程中,你需要为使用 Azure SQL 绑定的函数应用添加一个管理身份。
本教程使用用户指定管理身份(UAMI),推荐使用该身份,因为它可以跨资源共享,且不受应用生命周期影响。 有关Azure Functions中基于身份的连接的更多信息,请参见配置远程服务连接。
完成本教程后,函数应用即可连接 Azure SQL 数据库,无需用户名和密码。
以下是你所采取步骤的概述:
授予 Microsoft Entra 用户数据库访问权限
首先,通过指定一个Microsoft Entra用户作为服务器的Active Directory管理员,实现对SQL数据库的Microsoft Entra认证。 此用户与用于注册 Azure 订阅的 Microsoft 帐户不同。 它必须是你在 Microsoft Entra ID 中创建、导入、同步或邀请到其中的用户。 有关允许的 Microsoft Entra 用户的详细信息,请参阅 SQL 数据库中的 Microsoft Entra 功能和限制。
你可以通过Azure门户、PowerShell或Azure CLI启用Microsoft Entra认证。 Azure CLI的操作说明在以下部分。 有关通过 Azure 门户和 PowerShell 完成此任务的信息,请参见 Azure SQL 关于 Microsoft Entra 认证的文档。
如果 Microsoft Entra 租户还没有用户,请按照使用 Microsoft Entra ID 添加或删除用户中的步骤创建一个用户。
通过使用命令
az ad user list查找 Microsoft Entra 用户的对象 ID,并替换 <user-principal-name>。 把结果保存到变量里。对于 Azure CLI 2.37.0 及更新的版本:
azureaduser=$(az ad user list --filter "userPrincipalName eq '<user-principal-name>'" --query [].id --output tsv)对于旧版 Azure CLI:
azureaduser=$(az ad user list --filter "userPrincipalName eq '<user-principal-name>'" --query [].objectId --output tsv)提示
若要查看 Microsoft Entra ID 中所有用户主体名称的列表,请运行
az ad user list --query [].userPrincipalName。使用 PowerShell 中的命令将此Microsoft Entra用户添加为Active Directory管理员
az sql server ad-admin create。 在以下命令中,将 <server-name> 替换为服务器名称(不带.database.chinacloudapi.cn后缀)。az sql server ad-admin create --resource-group myResourceGroup --server-name <server-name> --display-name ADMIN --object-id $azureaduser
有关添加Active Directory管理员的更多信息,请参见为您的服务器配置Microsoft Entra管理员。
创建用户分配的托管标识
创建一个用户分配的管理身份,并将其分配给你的函数应用。 使用用户分配的身份,因为你可以在多个资源中重复使用,且其生命周期独立于你的函数应用。
在 Azure 门户中,搜索“托管身份”并选择“创建”。
选择你的 订阅、 资源组、 地区,并赋予身份 一个名称 (例如,
my-sql-identity)。选择 “审阅 + 创建”,然后选择“ 创建”。
创建标识后,在门户中切换到函数应用。
在 设置中,选择 身份,然后选择 “用户指定 ”标签。
选择 添加,选择你创建的托管身份,然后选择 添加。
提示
你也可以使用系统分配的托管身份。 如果你更喜欢系统分配,可以在身份页面的系统分配标签页启用它。 使用系统分配的托管标识时,SQL 命令中的 <identity-name> 是你的函数应用名称,并且连接字符串中不需要包含 User Id 参数。
授予 SQL 数据库访问托管标识的权限
在此步骤中,使用Microsoft Entra用户账户连接到SQL数据库,并授予管理身份数据库访问权限。
打开您偏好的SQL工具,并使用Microsoft Entra用户账户登录,例如您指定为管理员的Microsoft Entra用户。 你可以在 Cloud Shell 中使用 SQLCMD 命令完成这一步。
sqlcmd -S <server-name>.database.chinacloudapi.cn -d <db-name> -U <aad-user-name> -P "<aad-password>" -G -l 30在所需数据库的 SQL 提示符下运行以下命令,以授予函数权限。 例如,
CREATE USER [<identity-name>] FROM EXTERNAL PROVIDER; ALTER ROLE db_datareader ADD MEMBER [<identity-name>]; ALTER ROLE db_datawriter ADD MEMBER [<identity-name>]; GO<identity-name> 是 Microsoft Entra ID 中的托管标识的名称。 对于用户分配的身份,这个名字就是你创建身份时给该身份的名字(例如,
my-sql-identity)。 对于系统分配标识,其名称始终与函数应用的名称相同。注释
如果使用 Azure SQL 触发器,则托管标识需要除
db_datareader和db_datawriter以外的其他权限。 有关详细信息,请参阅为 Azure SQL 触发器授予权限。
配置 Azure 函数 SQL 连接字符串
在最后一步中,将函数应用的 SQL 连接字符串配置为使用 Microsoft Entra 托管标识身份验证。
你在函数代码中将连接字符串设置名称标识为绑定属性 ConnectionStringSetting,如 SQL 输入绑定的 属性和注释 中所示。
在函数应用的应用设置中,更新SQL的连接字符串设置,使其格式如下:
Server=<server-name>.database.chinacloudapi.cn; Authentication=Active Directory Default; Database=<database-name>; User Id=<client-id-of-user-assigned-identity>
将 <server-name> 替换为 SQL 服务器名称,将 <database-name> 替换为数据库名称,并将 <client-id-of-user-assigned-identity> 替换为用户分配的托管标识的客户端 ID。 您可以在Azure门户的管理身份资源的概览页面找到客户端ID。
提示
Active Directory Default认证关键词既能在本地(使用你的开发者凭证)也能在 Azure(使用托管身份)中工作。 这个功能意味着你可以在两个环境中使用相同的连接字符串。 对于系统分配的托管身份,省略参数 User Id 。
有关基于身份的连接的更多信息,请参见 配置与远程服务的连接。