你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

迁移应用程序以将无密码连接用于 Azure 队列存储

必须使用帐户访问密钥或无密码连接等配置对 Azure 服务的应用程序请求进行身份验证。 但是,应尽可能确定应用程序中无密码连接的优先级。 使用密码或密钥的传统身份验证方法会产生安全风险和复杂性。 访问 Azure 服务中心的无密码连接,详细了解迁移到无密码连接的优势。

以下教程介绍了如何使用无密码连接迁移现有应用程序以进行连接。 无论是使用访问密钥、连接字符串还是其他基于机密的方法,都适用这些相同的迁移步骤。

配置本地开发环境

无密码连接可以配置为同时用于本地和 Azure 托管的环境。 在本部分中,你将应用配置以允许单个用户向 Azure 队列存储进行身份验证,以便进行本地开发。

分配用户角色

在本地进行开发时,请确保访问队列存储的用户帐户具有正确的权限。 需要具有存储队列数据参与者角色才能读取和写入队列数据。 若要为你自己分配此角色,需要具有“用户访问管理员”角色,或者具有包含 Microsoft.Authorization/roleAssignments/write 操作的其他角色。 可使用 Azure 门户、Azure CLI 或 Azure PowerShell 向用户分配 Azure RBAC 角色。 可在范围概述页上详细了解角色分配的可用范围。

以下示例向用户分配了存储队列数据参与者角色。 此角色会授予对存储帐户中队列数据的读取和写入访问权限。

  1. 在 Azure 门户中,使用主搜索栏或左侧导航找到存储帐户。

  2. 在存储帐户概述页的左侧菜单中选择“访问控制 (IAM)”。

  3. 在“访问控制 (IAM)”页上,选择“角色分配”选项卡。

  4. 从顶部菜单中选择“+ 添加”,然后从出现的下拉菜单中选择“添加角色分配”。

    A screenshot showing how to assign a role.

  5. 使用搜索框将结果筛选为所需角色。 在此示例中,请搜索“存储队列数据参与者”并选择匹配的结果,然后选择“下一步”。

  6. 在“访问权限分配对象”下,选择“用户、组或服务主体”,然后选择“+ 选择成员”。

  7. 在对话框中,搜索 Microsoft Entra ID 用户名(通常是 user@domain 电子邮件地址),然后选中对话框底部的“选择”。

  8. 选择“查看 + 分配”转到最后一页,然后再次选择“查看 + 分配”完成该过程。

重要

在大多数情况下,角色分配在 Azure 中传播需要一两分钟,但在极少数情况下,可能最多需要 8 分钟。 如果在首次运行代码时收到身份验证错误,请稍等片刻再试。

在本地登录到 Azure

对于本地开发,请确保使用分配了该角色的同一 Microsoft Entra 帐户进行身份验证。 可以通过常用的开发工具(如 Azure CLI 或 Azure PowerShell)进行身份验证。 可用于进行身份验证的开发工具因语言而异。

使用以下命令通过 Azure CLI 登录到 Azure:

az login

更新应用程序代码以使用无密码连接

对于以下每个生态系统,Azure 标识客户端库都提供了一个 DefaultAzureCredential 类,可处理对 Azure 的无密码身份验证:

DefaultAzureCredential 支持多种身份验证方法。 要使用的方法将在运行时确定。 通过这种方法,你的应用可在不同环境(本地与生产)中使用不同的身份验证方法,而无需实现特定于环境的代码。 有关 DefaultAzureCredential 查找凭据的顺序和位置,请参阅上述链接。

  1. 若要在 .NET 应用程序中使用 DefaultAzureCredential,请安装 Azure.Identity 包:

    dotnet add package Azure.Identity
    
  2. 在文件的顶部,添加以下代码:

    using Azure.Identity;
    
  3. 确定代码中创建 QueueClient 对象以连接到 Azure 队列存储的位置。 更新代码,使之与以下示例一致:

    DefaultAzureCredential credential = new();
    
    QueueClient queueClient = new(
         new Uri($"https://{storageAccountName}.queue.core.windows.net/{queueName}"),
         new DefaultAzureCredential());
    
  1. 确保更新 QueueClient 对象的 URI 中的存储帐户名称。 可以在 Azure 门户的概述页上找到存储帐户名称。

    Screenshot showing how to find the storage account name.

在本地运行应用

进行这些代码更改后,在本地运行应用程序。 新配置应选取本地凭据,例如 Azure CLI、Visual Studio 或 IntelliJ。 你在 Azure 中分配给用户的角色将会允许应用在本地连接到 Azure 服务。

配置 Azure 托管环境

将应用程序配置为使用无密码连接并在本地运行后,相同的代码可以在应用程序部署到 Azure 后向 Azure 服务进行身份验证。 以下各部分介绍了如何配置已部署的应用程序,以使用托管标识连接到 Azure 队列存储。 托管标识在 Microsoft Entra ID 中提供了一个自动托管标识,供应用程序在连接到支持 Microsoft Entra 身份验证的资源时使用。 详细了解托管标识:

创建托管标识

你可以使用 Azure 门户或 Azure CLI 创建用户分配的托管标识。 应用程序将使用该标识向其他服务进行身份验证。

  1. 在 Azure 门户顶部搜索“托管标识”。 选择“托管标识”结果。
  2. 选择“托管标识”概述页面顶部的“+ 创建”。
  3. 在“基本信息”选项卡中,输入以下值:
    • “订阅”:选择所需的订阅。
    • “资源组”:选择所需的资源组。
    • 区域:选择你所在位置附近的区域。
    • “名称”:输入标识的可识别名称,例如“MigrationIdentity”。
  4. 在页面底部选择“查看 + 创建”。
  5. 验证检查完成后,选择“创建”。 Azure 将创建新的用户分配的标识。

创建资源后,选择“转到资源”以查看托管标识的详细信息。

A screenshot showing how to create a user assigned managed identity.

将托管标识与 Web 应用相关联

你需要将 Web 应用配置为使用自己创建的托管标识。 使用 Azure 门户或 Azure CLI 将标识分配给应用。

在 Azure 门户中完成以下步骤,从而将标识与应用相关联。 这些步骤同样也适用于以下 Azure 服务:

  • Azure Spring Apps
  • Azure Container Apps
  • Azure 虚拟机
  • Azure Kubernetes 服务
  1. 导航到 Web 应用的概述页面。

  2. 从左侧导航菜单中,选择“标识”。

  3. 在“标识”页面上,切换到“用户分配的”选项卡。

  4. 选择“+ 添加”,打开“添加用户分配的托管标识”浮出控件。

  5. 选择之前用于创建标识的订阅。

  6. 按名称搜索“MigrationIdentity”,并从搜索结果中选择该标识。

  7. 选择“添加”,以将该标识与应用相关联。

    Screenshot showing how to create a user assigned identity.

为托管标识分配角色

接下来,需要向创建的托管标识授予访问存储帐户的权限。 通过为托管标识分配角色来授予权限,就像对本地开发用户的操作一样。

  1. 导航到存储帐户概述页,并在左侧导航栏中选择“访问控制 (IAM)”。

  2. 选择“添加角色分配”

    Screenshot showing how to add a role to a managed identity.

  3. 在“角色”搜索框中,搜索“存储队列数据参与者”,这是用于管理队列数据操作的常用角色。 可以分配适合你的用例的任何角色。 从列表中选择“存储队列数据参与者”,然后选择“下一步”。

  4. 在“添加角色分配”屏幕上,针对“将访问权限分配给”选项,请选择“托管标识”。 然后选择“+选择成员”。

  5. 在浮出控件中,按名称搜索创建的托管标识,并从结果中选择该标识。 选择“选择”以关闭浮出控件菜单。

    Screenshot showing how to select the assigned managed identity.

  6. 多次选择“下一步”,直到可以选择“查看 + 分配”,从而完成角色分配。

更新应用程序代码

需要配置应用程序代码,以查找在部署到 Azure 时创建的特定托管标识。 在某些情况下,显式设置应用的托管标识还可以防止其他环境标识被意外检测到并自动使用。

  1. 在托管标识概述页面上,将客户端 ID 值复制到剪贴板。

  2. 应用以下特定于语言的更改:

    创建一个 DefaultAzureCredentialOptions 对象并将其传递给 DefaultAzureCredential。 将 ManagedIdentityClientId 属性设置为客户端 ID。

    DefaultAzureCredential credential = new(
        new DefaultAzureCredentialOptions
        {
            ManagedIdentityClientId = managedIdentityClientId
        });
    
  3. 进行此更改后,将代码重新部署到 Azure,以便应用配置更新。

测试应用程序

部署更新后的代码后,请在浏览器中导航到你的托管应用程序。 应用应能够成功连接到存储帐户。 请记住,角色分配通过 Azure 环境传播最长可能需要五分钟的时间。 应用程序现在配置为在本地和生产环境中运行,开发人员无需管理应用程序本身的机密。

后续步骤

本教程介绍了如何将应用程序迁移到无密码连接。

可以阅读以下资源,更深入地了解本文中讨论的概念: