快速入门:使用托管身份标识配置持久化函数

本快速入门展示了如何配置Durable Functions应用,使其在Durable Task Scheduler后端或Azure 存储提供商中使用基于身份的连接。 Azure 平台负责管理来自 Microsoft Entra ID 的托管身份——你无需预配或轮换任何机密。

这条路径假设你的应用已经配置为使用 Durable Task Scheduler 后端。 如果你的应用仍然使用 Azure 存储 提供者,请选择本文中的 Azure 存储 路径。

本文内容:

注意

Durable Functions 扩展版本2.7.0及更高版本支持托管标识。

如果你没有 Azure 帐户,请在开始之前创建一个试用帐户。

先决条件

若要完成本快速入门指南,你需要:

  • 在 Azure 门户中创建了现有 Durable Functions 项目或 Azure 中部署了本地 Durable Functions 项目。
  • 熟悉如何在 Azure 中运行 Durable Functions 应用。

如果没有已在 Azure 中部署的现有 Durable Functions 项目,建议从以下快速入门之一开始:

本地开发设置

有两个选项用于本地开发。 使用本地的Durable Task Scheduler模拟器,无需Azure凭证即可快速测试。 如果你需要用实时调度资源测试基于身份的连接,就用你的开发者凭证。

选项一:使用本地的Durable Task Scheduler模拟器

本地开发时,使用Durable Task Scheduler模拟器,这样你可以在没有Azure凭证的情况下测试你的应用。 将应用设置配置为指向模拟器,并使用默认任务中心。

{
  "IsEncrypted": false,
  "Values": {
    "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "DTS_CONNECTION_STRING": "Endpoint=http://localhost:8080;TaskHub=default;Authentication=None",
    "TASKHUB_NAME": "default"
  }
}

选项 2:用于本地开发的基于标识的连接

严格来说,托管身份只在 Azure 执行时对应用开放。 不过,你仍然可以通过开发者凭证对调度资源进行身份验证,配置本地运行的应用使用基于身份的连接。 然后,当应用部署到 Azure 后,它会改为使用托管标识配置。

当你使用开发者凭证时,连接会尝试从以下地点获取令牌,顺序如下:

  1. Microsoft 应用程序之间共享的本地缓存
  2. Visual Studio中的当前用户上下文
  3. Visual Studio Code中的当前用户上下文
  4. Azure CLI 中的当前用户上下文

如果没有这些选项成功,则会收到一个错误,指示应用无法检索身份验证令牌。 请确认你已使用具有访问你的调度程序资源权限的账户登录到所列工具之一。

将运行时配置为使用本地开发人员标识

  1. 在本地设置中,设置调度器端点,并使用 Authentication=DefaultAzure,以便应用程序使用你的开发者凭证。

    {
      "IsEncrypted": false,
      "Values": {
        "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
        "AzureWebJobsStorage": "UseDevelopmentStorage=true",
        "DTS_CONNECTION_STRING": "Endpoint=https://<your-scheduler-name>.<region>.durabletask.io;TaskHub=<your-task-hub>;Authentication=DefaultAzure",
        "TASKHUB_NAME": "<your-task-hub>"
      }
    }
    
  2. 在调度程序资源上或在特定任务中心范围内,向开发者身份授予 Durable Task Data Contributor 角色。

基于标识的连接用于部署在 Azure 上的应用

启用托管的身份资源

为你的函数应用启用托管身份。 函数应用必须具有系统分配的托管标识或用户分配的托管标识。 若要为函数应用启用托管标识,并详细了解两种类型的标识之间的差异,请参阅托管标识概述

为托管标识分配访问角色

在 Azure 门户中导航到你的调度程序资源,并将 Durable Task Data Contributor 角色分配给你的托管标识。 为遵循最小权限原则,应在任务中心范围内分配角色,而不是在整个调度程序范围内分配。 如果你使用用户分配的身份,选择 “管理身份 ”,然后选择 +选择成员

将托管标识配置添加到应用

在使用应用的托管标识之前,请对应用设置进行一些更改:

  1. 在 Azure 门户中,在“设置”下的函数应用资源菜单上,选择“环境变量”

  2. 添加或更新设置 DTS_CONNECTION_STRING ,使应用通过应用的托管身份连接到你的调度器。

    Endpoint=https://<your-scheduler-name>.<region>.durabletask.io;TaskHub=<your-task-hub>;Authentication=ManagedIdentity
    

    如果你使用用户指定的托管身份,请在连接字符串中包含客户端ID:

    Endpoint=https://<your-scheduler-name>.<region>.durabletask.io;TaskHub=<your-task-hub>;Authentication=ManagedIdentity;ClientID=<your-user-assigned-identity-client-id>
    
  3. TASKHUB_NAME 设置添加或更新为相同的任务中心名称。

  4. 如果你的功能主机需要 Azure 存储 来进行主机级操作,请单独配置AzureWebJobsStorage。 调度程序后端对持久状态使用 DTS 连接字符串,而不是 AzureWebJobsStorage

验证配置

若要确认托管标识的配置工作正常,请执行以下操作:

  1. 在 Azure 门户中,转到你的函数应用,并触发 Durable Functions 的编排。
  2. 通过查询状态端点或查看 监控 标签,确认编排是否成功完成。
  3. 如果看到身份验证错误,请验证:
    • 托管身份在调度器资源或任务中心的作用域中扮演 Durable Task Data Contributor 角色。
    • TASKHUB_NAMEDTS_CONNECTION_STRING设置是正确的。
    • 应用在Azure运行时使用了预期身份。

本地开发设置

有两个选项用于本地开发。 在没有Azure凭据的情况下,使用 Azurite 进行快速本地测试。 如果需要针对实际Azure 存储帐户测试基于标识的连接,请改用开发人员凭据。

选项 1:使用Azure 存储模拟器

在本地开发时,建议使用 Azurite,这是Azure 存储的本地模拟器。 通过在 local.settings.json 中指定 "AzureWebJobsStorage": "UseDevelopmentStorage=true" 将应用配置到模拟器。

选项 2:用于本地开发的基于标识的连接

严格说来,托管标识仅适用于在 Azure 上执行的应用。 但是,仍可以将本地运行的应用配置为使用基于标识的连接,方法是使用开发人员凭据针对Azure资源进行身份验证。 然后,在 Azure 上部署时,应用会改为使用您配置的托管标识。

使用开发人员凭据时,连接会按以下顺序尝试从以下位置获取令牌:

  1. Microsoft 应用程序之间共享的本地缓存
  2. Visual Studio中的当前用户上下文
  3. Visual Studio Code中的当前用户上下文
  4. Azure CLI 中的当前用户上下文

如果没有这些选项成功,则会收到一个错误,指示应用无法检索身份验证令牌。 验证是否已使用有权访问Azure 存储帐户的帐户登录到其中一个列出的工具。

将运行时配置为使用本地开发人员标识

  1. 在 local.settings.json 中指定 Azure 存储帐户的名称,例如:

    {
       "IsEncrypted": false,
       "Values": {
          "AzureWebJobsStorage__accountName": "<<your Azure Storage account name>>",
          "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"
       }
    }
    
  2. 在Azure门户中导航到Azure 存储帐户资源。

  3. 选择 访问控制 (IAM) 选项卡,然后选择添加角色分配

  4. 将以下每个角色分配给自己。 对于每个角色,请选择“+ 选择成员”并搜索用于登录Visual Studio、Visual Studio Code或Azure CLI的电子邮件。

    • 存储队列数据参与者
    • Storage Blob 数据贡献者
    • 存储表数据贡献者

    注意

    在部署到 Azure 时,托管标识需要同样的三个角色。 请参阅 向托管标识分配访问角色

    在 Azure 门户的访问控制页面中为用户分配存储数据参与者角色的截图。

基于标识的连接用于部署在 Azure 上的应用

启用托管的身份资源

首先,为应用程序启用托管标识。 函数应用必须具有系统分配的托管标识或用户分配的托管标识。 若要为函数应用启用托管标识,并详细了解两种类型的标识之间的差异,请参阅托管标识概述

为托管标识分配访问角色

在 Azure 门户中导航到您应用的 Azure 存储资源,然后将三个基于角色的访问控制 (RBAC) 角色分配给托管标识资源:

  • 存储队列数据参与者
  • Storage Blob 数据贡献者
  • 存储表数据贡献者

若要查找标识资源,请选择分配对“托管标识”的访问权限,然后选择“+ 选择成员”

在 Azure 门户中,将存储访问角色分配给托管身份的截图。

将托管标识配置添加到应用

在使用应用的托管标识之前,请对应用设置进行一些更改:

  1. 在 Azure 门户中,在“设置”下的函数应用资源菜单上,选择“环境变量”

  2. 在设置列表中,找到“AzureWebJobsStorage”并选择“删除”图标 在 Azure 门户函数应用设置中 AzureWebJobsStorage 环境变量的截图。

  3. 添加一个设置,用于将 Azure 存储帐户链接到应用程序。

    根据用于应用运行时采用的云,使用以下方法之一

    • Azure云:如果您的应用在global Azure中运行,请添加标识Azure存储帐户名称的设置AzureWebJobsStorage__accountName。 示例值: mystorageaccount123

    • Non-Azure cloud:如果应用程序在 Azure 外部的云中运行,则必须添加以下三个设置来提供存储帐户的特定服务 URI(或 endpoints),而不是帐户名称。

      • 设置名称:AzureWebJobsStorage__blobServiceUri

        示例值: https://mystorageaccount123.blob.core.chinacloudapi.cn/

      • 设置名称:AzureWebJobsStorage__queueServiceUri

        示例值: https://mystorageaccount123.queue.core.chinacloudapi.cn/

      • 设置名称:AzureWebJobsStorage__tableServiceUri

        示例值: https://mystorageaccount123.table.core.chinacloudapi.cn/

    可以从“终结点”选项卡的存储帐户信息中获取这些 URI 变量的值

    存储帐户终结点选项卡的屏幕截图,其中显示了 Blob、队列和表服务 URI。

  4. 完成托管标识配置(更改设置后记得单击“应用”):

    • 如果使用系统分配的标识,不要进行其他更改。

    • 如果使用“用户分配的标识”,请将以下设置添加到应用配置中

      • AzureWebJobsStorage__credential 中,输入 managedidentity

      • AzureWebJobsStorage__clientId,请从托管标识资源中获取此 GUID 值。

    用户分配的托管标识资源的屏幕截图,其中显示了客户端 ID 值。

    注意

    在使用用户分配的标识时,Durable Functions 支持 managedIdentityResourceId。 改用 clientId

验证配置

若要确认托管标识的配置工作正常,请执行以下操作:

  1. 在 Azure 门户中,导航到你的函数应用程序并触发 Durable Functions 编排(例如,使用 HTTP 触发器函数)。
  2. 通过查询状态终结点或检查Monitor选项卡,确认编排是否成功完成。
  3. 如果看到身份验证错误,请验证:
    • 这三个存储数据参与者角色都分配给了正确的身份。
    • 删除了 AzureWebJobsStorage 连接字符串设置。
    • AzureWebJobsStorage__accountName 设置正确(或服务 URI)。

后续步骤