教程:使用托管标识和 SQL 绑定将函数应用连接到 Azure SQL

Azure Functions 提供了一个托管标识,它是用于保护对 Azure SQL 数据库和其他 Azure 服务的访问的统包解决方案。 托管标识可以让应用更安全,因为不需在应用中存储机密,例如连接字符串中的凭据。 本教程将向使用 Azure SQL 绑定的 Azure 函数添加托管标识。 ToDo 后端示例中提供了一个使用 SQL 绑定的示例 Azure Function 项目。

完成本教程后,Azure 函数将连接到 Azure SQL 数据库,而无需用户名和密码。

步骤的概述将执行以下操作:

向数据库授予对 Microsoft Entra 用户的访问权限

首先,通过将 Microsoft Entra 用户指定为服务器的 Active Directory 管理员,对 SQL 数据库启用 Microsoft Entra 身份验证。 此用户与用于注册 Azure 订阅的 Microsoft 帐户不同。 它必须是你在 Microsoft Entra ID 中创建、导入、同步或邀请到其中的用户。 有关允许的 Microsoft Entra 用户的详细信息,请参阅 SQL 数据库中的 Microsoft Entra 功能和限制

启用 Microsoft Entra 身份验证可以通过 Azure 门户、PowerShell 或 Azure CLI 完成。 下面是 Azure CLI 的说明,有关通过 Azure 门户和 PowerShell 完成此操作的信息,请参阅有关 Microsoft Entra 身份验证的 Azure SQL 文档

  1. 如果 Microsoft Entra 租户还没有用户,请按照使用 Microsoft Entra ID 添加或删除用户中的步骤创建一个用户。

  2. 使用 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

  3. 使用 PowerShell 中的 az sql server ad-admin create 命令,将此 Microsoft Entra 用户添加为 Active Directory 管理员。 在以下命令中,将 <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 函数上启用系统分配的托管标识

在此步骤中,我们将向 Azure 函数添加系统分配的标识。 在后面的步骤中,该标识将被授予访问 SQL 数据库的权限。

若要在 Azure 门户中启用系统分配的托管标识,请执行以下操作:

  1. 在门户中像平时一样创建 Azure 函数。 在门户中导航到该应用。
  2. 在左侧导航栏中向下滚动到“设置”组。
  3. 选择“标识”。
  4. 在“系统分配的”选项卡中,将“状态”切换为“启用” 。 单击“保存” 。

Turn on system assigned identity for Function app

若要了解如何通过 Azure CLI 或 PowerShell 启用系统分配的托管标识,请查看有关在 Azure Functions 中使用托管标识的的更多信息。

提示

对于用户分配的托管标识,请切换到“用户分配”选项卡。单击“添加”并选择一个托管标识。 有关如何创建用户分配的托管标识的详细信息,请参阅管理用户分配的托管标识

授予 SQL 数据库访问托管标识的权限

在此步骤中,我们将使用 Microsoft Entra 用户帐户连接到 SQL 数据库,并授予托管标识对数据库的访问权限。

  1. 打开首选的 SQL 工具并使用 Microsoft Entra 用户帐户(例如,我们指定为管理员的 Microsoft Entra 用户)登录。

    sqlcmd -S <server-name>.database.chinacloudapi.cn -d <db-name> -U <aad-user-name> -P "<aad-password>" -G -l 30
    
  2. 在所需数据库的 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 中的托管标识的名称。 如果标识是系统分配的,则此名称始终与函数应用的名称相同。

配置 Azure 函数 SQL 连接字符串

在最后一步中,我们将配置 Azure 函数 SQL 连接字符串以使用 Microsoft Entra 托管标识身份验证。

连接字符串设置名称在我们的 Functions 代码中标识为绑定属性“ConnectionStringSetting”,如 SQL 输入绑定属性和注释中所示。

在函数应用的应用程序设置中,SQL 连接字符串设置应更新为遵循以下格式:

Server=demo.database.chinacloudapi.cn; Authentication=Active Directory Managed Identity; Database=testdb

testdb 是连接到的数据库的名称,demo.database.chinacloudapi.cn 是连接到的服务器的名称 。

提示

对于用户分配的托管标识,请使用 Server=demo.database.chinacloudapi.cn; Authentication=Active Directory Managed Identity; User Id=ClientIdOfManagedIdentity; Database=testdb

后续步骤