教學課程:使用 Key Vault 從 .NET App Service 保護認知服務連線

Azure App Service 可以不需要使用連接字串,即可使用受控身分識別連線後端服務,其能夠消除連線祕密,以管理並保持您在實際執行環境中的後端連線能力安全。 針對不支援受控識別且仍然需要連線祕密的後端服務,您可以使用 Key Vault 來管理連線祕密。 本教學課程使用 Azure AI 服務作為範例,為您示範其實際執行方式。 當您完成時,您會擁有能對 Azure AI 服務進行程式設計呼叫的應用程式,而不需將任何連線密碼儲存在 App Service 內。

提示

Azure AI 服務確實能透過受控識別支援驗證,但本教學課程會使用訂用帳戶金鑰驗證來示範您可以如何連線至來自 App Services 不支援受控識別的 Azure 服務。

Architecture diagram for tutorial scenario.

透過此結構:

  • 與 Key Vault 的連線能力受到受控識別保護
  • App Service 使用 Key Vault 參考作為應用程式設定來存取祕密。
  • 對金鑰保存庫的存取僅限於應用程式。 應用程式參與者,例如系統管理員,可能能夠完全控制 App Service 資源,但是同時無法存取 Key Vault 祕密。
  • 如果您的應用程式程式碼已透過應用程式設定存取連線祕密,則不需要變更。

您將了解:

  • 啟用受控識別
  • 使用受控識別連線至 Key Vault
  • 使用 Key Vault 參考
  • 存取 Azure AI 服務

必要條件

備妥環境以使用 Azure CLI。

建立可連線至 Azure AI 服務的應用程式

  1. 建立資源群組以包含您所有的資源:

    # Save resource group name as variable for convenience
    groupName=myKVResourceGroup
    region=westeurope
    
    az group create --name $groupName --location $region
    
  2. 建立 Azure AI 服務資源。 以您選擇的唯一名稱取代 <cs-resource-name>

    # Save resource name as 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 會建立免費層 Azure AI 服務資源。 每個訂用帳戶僅限一個免費層 TextAnalytics 資源的配額。 如果您已經超過配額,請改用 --sku S

設定 .NET 應用程式

在本機複製範例存放庫,並將範例應用程式部署至 App Service。 以唯一名稱取代 <app-name>

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

# Clone 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. 將 Azure AI 服務祕密設為應用程式設定 CS_ACCOUNT_NAMECS_ACCOUNT_KEY

    # Get subscription key for Cognitive Services 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>.azurewebsites.net 的部署應用程式,並試用各種語言字串的語言偵測器。

    Screenshot that shows deployed language detector app in App Service.

    如果您查看應用程式程式碼,您可能會注意到偵測結果的偵錯輸出字型色彩與背景相同。 您可以透過嘗試反白在結果正下方的空白字元查看。

保護後端連線能力

目前,連線祕密會儲存為您 App Service 應用程式中的應用程式設定。 此方法已經保護來自您應用程式程式碼基底的連線祕密。 然而,任何可以管理您應用程式的參與者也可以查看應用程式設定。 在此步驟中,您會將連線祕密移動至金鑰保存庫,並鎖定存取,所以只有您可以進行管理,而且只有 App Service 應用程式可以使用其受控識別進行讀取。

  1. 建立金鑰保存庫。 以唯一名稱取代 <vault-name>

    # Save app name as 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. 為您自己提供保存庫的 Key Vault 祕密長 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. 為您的應用程式啟用系統指派的受控識別,並為其提供 Key Vault 祕密使用者 RBAC 角色。

    az webapp identity assign --resource-group $groupName --name $appName --scope $vaultResourceId --role  "Key Vault Secrets User"
    
  4. 將 Azure AI 服務資源名稱和訂用帳戶金鑰新增為保存庫的祕密,並將其識別碼儲存為下一個步驟的環境變數。

    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>.azurewebsites.net。 如果您取回偵測結果,您則正在使用金鑰保存庫參考連線至 Azure AI 服務端點。

恭喜,您的應用程式現在使用金鑰保存庫中保留的祕密連線至 Azure AI 服務,不需要對應用程式程式碼進行任何變更。

清除資源

在上述步驟中,您已建立資源群組中的 Azure 資源。 如果您在未來不需要這些資源,請在 Cloud Shell 中執行下列命令,刪除資源群組:

az group delete --name $groupName

此命令可能會花一分鐘執行。

下一步