教程:从 .NET Web 应用访问 Azure 服务

了解如何通过使用托管标识,从运行在 Azure 应用服务上的 Web 应用程序(而不是已登录用户)访问 Azure 服务,如 Azure 存储。 作为示例,本教程演示如何连接到 Azure 存储。

使用本教程可以安全地访问支持托管标识(下图中为 B)的任何服务

  • Azure 存储
  • Azure SQL 数据库
  • Azure 密钥保管库

关系图展示如何访问存储。

想要从 Web 应用添加对 Azure 服务(包括 Azure 存储、Azure SQL 数据库和 Azure 密钥保管库)的安全访问。 你可以使用共享密钥,但之后需要考虑操作安全性:谁可以创建、部署和管理机密。 还可能会将此密钥签入 GitHub,黑客知道如何扫描它。 向 Web 应用授予数据访问权限的更安全方法是使用托管标识

Microsoft Entra ID 中的托管标识允许应用服务通过基于角色的访问控制 (RBAC) 访问资源,而不要求使用应用凭据。 将托管标识分配给 Web 应用后,Azure 负责创建和分发证书。 用户无需费心管理机密或应用凭据。

在本教程中,你将了解:

  • 在 Web 应用上创建系统分配的托管标识。
  • 创建存储帐户和 Azure Blob 存储容器。
  • 使用托管标识从 Web 应用访问存储。

如果没有 Azure 订阅,可在开始前创建一个试用帐户

先决条件

在应用上启用托管标识

如果通过 Visual Studio 创建和发布 Web 应用,则已在应用上启用了托管标识。

  1. 在应用服务中,在左侧菜单中,选择 “标识”,然后选择“ 系统分配”。 验证“状态”是否设置为“开启”。

    如果没有,请选择 “打开”,然后选择 “保存”。 若要启用系统分配的托管标识,请在确认对话框中选择“ ”。 启用托管标识后,状态将设置为“启用”并且对象 ID 可用。

    显示“系统分配的标识”选项的屏幕截图。

  2. 此步骤创建一个新的对象 ID,该 ID 不同于在“身份验证/授权”窗格中创建的应用 ID。 复制系统分配的托管标识的对象 ID。 稍后需要用到它。

创建存储帐户和 Blob 存储容器

现在可以创建存储帐户和 Blob 存储容器。

每个存储帐户都必须属于 Azure 资源组。 资源组是 Azure 服务的逻辑容器。 创建存储帐户时,可以创建新的资源组或使用现有资源组。 本文介绍如何创建新资源组。

可以通过通用 v2 存储帐户访问所有 Azure 存储服务,包括 Blob、文件、队列、表和磁盘。 本文所述的步骤将创建常规用途 v2 存储帐户,但创建任何类型的存储帐户的步骤都相似。

Azure 存储中的 Blob 已组织成容器。 你需要先创建容器,然后才能在本教程的稍后部分上传 Blob。

若要在 Azure 门户中创建常规用途 v2 存储帐户,请执行以下步骤。

  1. 在Azure门户菜单上,输入 Storage 帐户。 您开始键入时,列表会根据您的输入进行筛选。 选择“存储帐户” 。

  2. 在显示的“存储帐户”窗口中,选择“创建”。

  3. 选择要在其中创建存储帐户的订阅。

  4. 对于 资源组,请选择包含 Web 应用的资源组。

  5. 为存储帐户输入名称。 所选名称在 Azure 中必须唯一。 名称长度必须介于 3 到 24 个字符之间,并且只能包含数字和小写字母。

  6. 选择存储帐户的位置(区域)或使用默认值。

  7. 将这些字段设置为其默认值:

    字段
    性能 标准
    Redundancy 异地冗余存储
  8. 选择“查看+创建”可查看存储帐户设置并创建帐户。

  9. 选择“创建” 。

若要在 Azure 存储中创建 Blob 存储容器,请执行以下步骤。

  1. 转到 Azure 门户中的新存储帐户。

  2. 在存储帐户的左侧菜单中,在 “数据存储”下,选择“ 容器”。

  3. 选择 “添加容器”。

  4. 为新容器键入名称。 容器名称必须小写,必须以字母或数字开头,并且只能包含字母、数字和短划线 (-) 字符。

  5. 设置容器的公共访问权限级别。 默认级别为“专用(禁止匿名访问)”。

  6. 选择“确定” 创建容器。

授予对存储帐户的访问权限

你需要先向 Web 应用授予对存储帐户的访问权限,然后才能创建、读取或删除 Blob。 在上一部分中,你使用托管标识配置了在应用服务上运行的 Web 应用。 使用 Azure RBAC,您可以像对待任何安全主体一样,给予托管身份对其他资源的访问权限。

存储 Blob 数据参与者角色为通过系统分配的托管标识表示的 Web 应用提供读取、写入和删除 Blob 容器及数据的访问权限。

注意

Azure RBAC 不支持对专用 Blob 容器执行某些操作,例如查看 blob 或在帐户之间复制 blob。 具有私有访问权限级别的 Blob 容器,对于 Azure RBAC 未授权的任何操作,都需要使用 SAS 令牌。 有关详细信息,请参阅何时使用共享访问签名

  1. Azure 门户中,进入你的存储帐户,向 Web 应用授予访问权限。
  2. 在左侧菜单中,选择 “访问控制”(IAM),然后选择“ 角色分配”。 可以看到谁有权访问存储帐户的列表。
  3. 需要向需要访问存储帐户的应用服务添加角色分配。 选择 添加>添加角色分配 打开“添加角色分配”页面。
  4. 在存储帐户范围内将 存储 Blob 数据贡献者 角色分配给 应用服务。 如需了解更多信息,请参阅使用 Azure 门户分配 Azure 角色

Web 应用现在可以访问存储帐户。

访问 Blob 存储

DefaultAzureCredential 类用于获取代码的令牌凭据,以授权对 Azure 存储的请求。 创建 DefaultAzureCredential 类的实例,该类使用托管标识提取令牌并将其附加到服务客户端。 下面的代码示例获取经过身份验证的令牌凭据,并使用它创建服务客户端对象,该对象将上传新的 Blob。

若要查看作为示例应用程序一部分的代码,请参阅 GitHub 上的示例

安装客户端库包

安装要与 Blob 存储一起使用的 Blob 存储 NuGet 包,并安装适用于 .NET NuGet 包的 Azure 标识客户端库以使用 Microsoft Entra 凭据进行身份验证。 使用 .NET Core 命令行接口或 Visual Studio 中的包管理器控制台,在项目中安装客户端库。

.NET Core 命令行

  1. 打开一个命令行,并切换到包含项目文件的目录。

  2. 运行安装命令。

    dotnet add package Azure.Storage.Blobs
    
    dotnet add package Azure.Identity
    

程序包管理器控制台

  1. 在 Visual Studio 中打开项目或解决方案,并使用“工具”“NuGet 包管理器”>“包管理器控制台”命令打开控制台 。

  2. 运行安装命令。

    Install-Package Azure.Storage.Blobs
    
    Install-Package Azure.Identity
    

.NET 示例

using System;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Text;
using System.IO;
using Azure.Identity;

// Some code omitted for brevity.

static public async Task UploadBlob(string accountName, string containerName, string blobName, string blobContents)
{
    // Construct the blob container endpoint from the arguments.
    string containerEndpoint = string.Format("https://{0}.blob.core.chinacloudapi.cn/{1}",
                                                accountName,
                                                containerName);

    // Get a credential and create a client object for the blob container.
    BlobContainerClient containerClient = new BlobContainerClient(new Uri(containerEndpoint),
                                                                    new DefaultAzureCredential());

    try
    {
        // Create the container if it doesn't exist.
        await containerClient.CreateIfNotExistsAsync();

        // Upload text to a new block blob.
        byte[] byteArray = Encoding.ASCII.GetBytes(blobContents);

        using (MemoryStream stream = new MemoryStream(byteArray))
        {
            await containerClient.UploadBlobAsync(blobName, stream);
        }
    }
    catch (Exception e)
    {
        throw e;
    }
}

清理资源

如果完成本教程,不再需要 Web 应用或关联的资源,请清理所创建的资源。

删除资源组

  1. Azure 门户中,从 Azure 门户菜单中选择 资源组 ,然后选择包含应用服务和应用服务计划的资源组。

  2. 选择“删除资源组”,删除该资源组和所有资源。

    显示删除资源组的屏幕截图。

  3. 输入要确认的资源组的名称。

这个过程可能需要几分钟才能完成。

后续步骤

在本教程中,你将了解:

  • 创建系统分配的托管标识。
  • 创建存储帐户和 Blob 存储容器。
  • 使用托管标识从 Web 应用访问存储。