Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Azure 密钥保管库提供了一种存储凭据和其他机密的方法,安全性更高。 但代码需要进行身份验证才能从 密钥保管库 中检索它们。 Azure资源的托管标识通过为Azure服务提供Microsoft Entra ID中的自动托管标识来解决此问题。 代码使用此标识向任何支持Microsoft Entra身份验证的服务(包括密钥保管库)进行身份验证,而无需在代码中嵌入凭据。
在本教程中,你将创建Azure Web 应用程序并将其部署到Azure 应用服务,然后使用托管标识通过用于.NET和Azure CLI的 Azure 密钥保管库 机密客户端库对应用进行身份验证。 如果使用其他语言、Azure PowerShell或Azure门户,则适用相同的原则。
有关应用服务 Web 应用和部署的详细信息,请参阅:
- 应用服务概述
在 Azure 应用服务 - 将文件部署到应用服务
先决条件
要完成本教程,需要:
- 一个Azure订阅。 免费创建一个。
- .NET 8.0 SDK 或更高版本。
- Azure CLI 或 Azure PowerShell。
- Azure 密钥保管库。 可以使用 Azure 门户、Azure CLI 或 Azure PowerShell 创建密钥保管库。
- 一个 密钥保管库 secret。 可以使用 Azure 门户、PowerShell或 Azure CLI 创建机密。
如果已在Azure 应用服务中部署了 Web 应用,请跳到配置 Web 应用以连接到密钥保管库并修改应用以访问key vault。
创建.NET核心应用
在此步骤中,设置本地.NET项目。
在终端窗口中,创建一个名为 akvwebapp 并切换到它的目录:
mkdir akvwebapp
cd akvwebapp
使用 dotnet new Web 命令创建.NET Web 应用:
dotnet new web
在本地运行应用,查看应用在部署到Azure之前的外观:
dotnet run
在 Web 浏览器中,打开应用。http://localhost:5000 从示例应用看到“Hello World!”消息。
有关创建 Web 应用的详细信息,请参阅在 Azure 应用服务 中创建 ASP.NET Core Web 应用
将应用部署到Azure
在此步骤中,使用 zip 部署将.NET应用部署到Azure 应用服务。 Zip 部署是 App Service 推荐的包部署机制。 若要从源代码管理持续交付,请改用GitHub Actions或Azure DevOps管道。
创建资源组
使用 az group create 创建资源组以包含密钥保管库和 Web 应用:
az group create --name "<resource-group>" --location "chinaeast2"
创建应用服务计划
使用 az appservice plan create 创建应用服务计划。 以下示例在免费(myAppServicePlan)层级中创建一个名为 FREE 的计划:
az appservice plan create --name myAppServicePlan --resource-group <resource-group> --sku FREE
创建 Web 应用
重要
与密钥保管库一样,Azure Web 应用必须具有全局唯一的名称。 将 <webapp-name> 替换为您的 Web 应用名称。
az webapp create --resource-group "<resource-group>" --plan "myAppServicePlan" --name "<webapp-name>"
转到新应用以确认它正在运行:
https://<webapp-name>.chinacloudsites.cn
可以看到新Azure Web 应用的默认页面。
使用 ZIP 部署本地应用
从 akvwebapp 项目目录中,构建项目并创建部署 zip 文件:
dotnet publish -c Release -o ./publish
cd publish
zip -r ../akvwebapp.zip .
cd ..
Tip
在 Windows 上,如果没有 zip,请使用 PowerShell:Compress-Archive -Path .\publish\* -DestinationPath .\akvwebapp.zip。
使用 az webapp deploy 将 zip 部署到 Web 应用:
az webapp deploy --resource-group "<resource-group>" --name "<webapp-name>" --src-path ./akvwebapp.zip --type zip
在 Web 浏览器中刷新已部署的应用:
https://<webapp-name>.chinacloudsites.cn
你会看到与在http://localhost:5000处看到的同样的“Hello World!”消息。
配置 Web 应用以连接到密钥保管库
在本部分中,你将允许 Web 应用访问密钥保管库并更新应用代码以检索机密。
创建托管标识并为其分配访问权限
使用托管标识向 密钥保管库 对 Web 应用进行身份验证。 托管标识使你无需在代码中管理凭据。
使用 az webapp identity assign 为应用创建标识:
az webapp identity assign --name "<webapp-name>" --resource-group "<resource-group>"
该命令返回如下所示的 JSON 代码片段:
{
"principalId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"tenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"type": "SystemAssigned"
}
若要通过 Role-Based 访问控制 (RBAC)获取密钥保管库的权限,请使用 Azure CLI 命令 az role assignment create 将角色分配给“用户主体名称”(UPN)。
az role assignment create --role "Key Vault Secrets User" --assignee "<upn>" --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.KeyVault/vaults/<your-unique-keyvault-name>"
将 <upn>、<subscription-id>、<resource-group-name> 和 <your-unique-keyvault-name> 替换为你的实际值。 你的 UPN 通常采用电子邮件地址格式(例如 username@domain.com)。
修改应用以访问密钥保管库
本教程使用Azure 密钥保管库机密客户端库。 还可以使用Azure 密钥保管库证书客户端库或Azure 密钥保管库密钥客户端库。
安装这些软件包
在终端窗口中,安装Azure 密钥保管库机密客户端库和Azure标识客户端库:
dotnet add package Azure.Identity
dotnet add package Azure.Security.KeyVault.Secrets
更新代码
在您的Program.cs项目中打开akvwebapp。
在文件顶部添加以下 using 指令:
using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
using Azure.Core;
在 app.MapGet 调用之前添加以下代码行,并将 <vault-name> 替换为你的密钥保管库名称。 此代码使用 DefaultAzureCredential 通过 Web 应用的托管标识对密钥保管库进行身份验证。 有关详细信息,请参阅 开发人员指南。 该代码还为重试配置了指数退避策略,以防 密钥保管库 被限流。 有关事务限制的详细信息,请参阅Azure 密钥保管库限制指南。
SecretClientOptions options = new SecretClientOptions()
{
Retry =
{
Delay= TimeSpan.FromSeconds(2),
MaxDelay = TimeSpan.FromSeconds(16),
MaxRetries = 5,
Mode = RetryMode.Exponential
}
};
var client = new SecretClient(new Uri("https://<vault-name>.vault.azure.cn/"), new DefaultAzureCredential(), options);
KeyVaultSecret secret = client.GetSecret("<secret-name>");
string secretValue = secret.Value;
将行 app.MapGet("/", () => "Hello World!"); 更新为:
app.MapGet("/", () => secretValue);
保存所做的更改。
重新部署 Web 应用
重新生成部署包并重新部署:
dotnet publish -c Release -o ./publish
cd publish
zip -r ../akvwebapp.zip .
cd ..
az webapp deploy --resource-group "<resource-group>" --name "<webapp-name>" --src-path ./akvwebapp.zip --type zip
前往已完成的 Web 应用
https://<webapp-name>.chinacloudsites.cn
之前显示“Hello World!”的地方,现在会显示你的 secret 值。
后续步骤
将Azure 密钥保管库与部署到 .NET - 详细了解 Azure 资源的托管标识。
- 查看密钥保管库开发人员指南。
- 保护对密钥保管库的访问