教程:使用 密钥保管库 从 .NET 应用服务保护 Foundry 工具连接

Azure 应用服务 可以使用 托管标识 在没有连接字符串的情况下连接到后端服务。 该方法消除了需要管理的连接机密,并确保在生产环境中后端连接的安全性。 完成后,你有一个应用,无需在应用服务中存储任何连接机密即可对 Foundry 工具进行编程调用。

对于不支持托管标识且仍需要连接机密的后端服务,可以使用 Azure 密钥保管库 来管理连接机密。 本教程以 Foundry 工具为例。 完成后,你有一个应用,无需在应用服务中存储任何连接机密即可对 Foundry 工具进行编程调用。

提示

Foundry 工具 支持通过托管标识进行身份验证。 本教程使用 订阅密钥身份验证 来演示如何连接到不支持应用服务的托管标识的 Azure 服务。

显示用户连接到服务的示意图,该服务随后连接到密钥保管库以访问认知服务。

在此体系结构中:

  • 托管标识可保护与密钥保管库的连接。
  • 应用服务使用 密钥保管库 引用 作为应用设置来访问机密。
  • 应用程序的访问权限仅限于密钥存储库。 应用参与者(如管理员)可能完全控制应用服务资源,同时无权访问 密钥保管库 机密。
  • 如果你的应用程序代码可以通过应用设置访问连接机密,则无需进行任何更改。

在本教程中,学习以下内容:

  • 启用托管标识
  • 使用托管标识连接到密钥保管库
  • 使用 密钥保管库 引用
  • Access Foundry 工具

先决条件

为 Azure CLI 准备环境。

  • 如需在本地运行 CLI 参考命令,请安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI

    • 如果使用的是本地安装,请使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录

    • 出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展详细信息,请参阅使用 Azure CLI 的扩展

    • 运行 az version 以查找安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade

创建连接到 Foundry 工具的应用

  1. 创建一个资源组以包含你的所有资源:

    # Save the resource group name as a variable for convenience
    groupName=myKVResourceGroup
    region=chinanorth3
    
    az group create --name $groupName --location $region
    
  2. 创建 Foundry Tools 资源。 将 cs-resource-name< 替换为>唯一名称。

    # Save the resource name as a variable for convenience. 
    csResourceName=<cs-resource-name>
    
    az cognitiveservices account create --resource-group $groupName --name $csResourceName --location $region --kind TextAnalytics --sku F0 --custom-domain $csResourceName
    

    注意

    --sku F0 创建一个免费基础层的 Foundry 工具资源。 每个订阅限制于一个免费层级 TextAnalytics 资源的配额。 如果已使用配额,请改用 --sku S

配置 .NET 应用

在本地克隆示例存储库,并将示例应用程序部署到应用服务。 将 <app-name> 替换为唯一的名称。

# Save the app name as a variable for convenience
appName=<app-name>

# Clone the sample application
git clone https://github.com/Azure-Samples/app-service-language-detector.git
cd app-service-language-detector/dotnet

az webapp up --sku F1 --resource-group $groupName --name $appName --plan $appName --location $region

将密钥配置为应用程序设置

  1. 将 Foundry Tools 机密配置为应用设置 CS_ACCOUNT_NAMECS_ACCOUNT_KEY

    # Get the subscription key for the Foundry Tools resource
    csKey1=$(az cognitiveservices account keys list --resource-group $groupName --name $csResourceName --query key1 --output tsv)
    
    az webapp config appsettings set --resource-group $groupName --name $appName --settings CS_ACCOUNT_NAME="$csResourceName" CS_ACCOUNT_KEY="$csKey1"
    
  2. 在浏览器中,访问已部署的应用程序,网址为 <app-name>.chinacloudsites.cn。 通过输入各种语言的字符串来尝试语言检测器。

    显示应用服务中已部署的语言检测器应用的屏幕截图。

    如果查看应用程序代码,检测结果的调试输出可能与背景的字体颜色相同。 可以通过在结果下方选择空白区域来查看输出。

保护后端连接

连接机密现在作为应用设置存储在应用服务应用中。 此方法已确保连接机密不再存在于应用程序代码库中。 但是,任何可以管理你的应用的参与者也能看到应用设置。 在本部分中,将连接机密移动到密钥保管库。 锁定访问权限,以便只有你可以管理它,并且只有应用服务应用可以使用其托管标识读取它。

  1. 创建密钥保管库。 将 <vault-name> 替换为唯一名称。

    # Save the key vault name as a variable for convenience
    vaultName=<vault-name>
    
    az keyvault create --resource-group $groupName --name $vaultName --location $region --sku standard --enable-rbac-authorization
    

    --enable-rbac-authorization 参数将 Azure 角色基于访问控制(RBAC)设置为权限模型。 默认情况下,此设置会使所有访问策略权限失效。

  2. 为你自己分配对保管库的“密钥保管库机密主管”RBAC 角色。

    vaultResourceId=$(az keyvault show --name $vaultName --query id --output tsv)
    myId=$(az ad signed-in-user show --query id --output tsv)
    az role assignment create --role "Key Vault Secrets Officer" --assignee-object-id $myId --assignee-principal-type User --scope $vaultResourceId
    
  3. 为应用启用系统分配的托管身份,并为其分配“密钥保管库机密用户”RBAC角色,以访问保管库。

    az webapp identity assign --resource-group $groupName --name $appName --scope $vaultResourceId --role  "Key Vault Secrets User"
    
  4. 将 Foundry Tools 资源名称和订阅密钥作为机密添加到保管库,并将其 ID 保存为下一步的环境变量。

    csResourceKVUri=$(az keyvault secret set --vault-name $vaultName --name csresource --value $csResourceName --query id --output tsv)
    csKeyKVUri=$(az keyvault secret set --vault-name $vaultName --name cskey --value $csKey1 --query id --output tsv)
    
  5. 前面你已在应用中将机密设置为 CS_ACCOUNT_NAMECS_ACCOUNT_KEY 应用设置。 现在,请改为将它们设置为密钥保管库引用

    az webapp config appsettings set --resource-group $groupName --name $appName --settings CS_ACCOUNT_NAME="@Microsoft.KeyVault(SecretUri=$csResourceKVUri)" CS_ACCOUNT_KEY="@Microsoft.KeyVault(SecretUri=$csKeyKVUri)"
    
  6. 在浏览器中,再次转到 <app-name>.chinacloudsites.cn 。 如果获取到检测结果,则通过密钥库引用连接到 Foundry Tools 终结点。

恭喜,你的应用现在使用密钥保管库中保存的机密连接到 Foundry 工具,并且你没有对应用程序代码进行任何更改。

清理资源

在前面的步骤中,你在资源组中创建了 Azure 资源。 如果认为将来不需要这些资源,请在本地 Shell 中运行以下命令删除资源组:

az group delete --name $groupName

运行此命令可能需要一分钟时间。