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

使用 Azure Active Directory B2C 授予对 FHIR 服务的访问权限

医疗保健组织可以将 Azure Active Directory B2C (Azure AD B2C) 与 Azure Health Data Services 中的 FHIR® 服务一起使用,以授予对其应用程序和用户的访问权限。

为 FHIR 服务创建 Azure AD B2C 租户

为 FHIR 服务创建 Azure AD B2C 租户可设置用于管理医疗保健应用程序中用户身份的安全基础结构。

如果已创建 Azure AD B2C 租户,则可以跳到使用 Azure AD B2C 部署 FHIR 服务

使用 ARM 範本部署 Azure AD B2C 租用戶

使用 PowerShell 或 Azure CLI 以编程方式将 ARM 模板部署到 Azure 订阅。 有关模板的语法、属性和用法的更多信息,请参阅部署 Azure Active Directory B2C 实例

在 Azure Cloud Shell 或 PowerShell 中的 Visual Studio Code 本地运行代码,将 FHIR 服务部署到 Azure AD B2C 租户。

  1. 使用 Connect-AzAccount 以登录到 Azure。 登录后,使用 Get-AzContext 验证要使用的订阅和租户。 如果需要,请更改订阅和租户。

  2. 创建新资源组,或者通过跳过步骤或注释禁止以 New-AzResourceGroup 开头的行来使用现有的资源组。

### variables
$tenantid="your tenant id"
$subscriptionid="your subscription id"
$resourcegroupname="your resource group name"
$b2cName="your b2c tenant name"

### login to azure
Connect-AzAccount -Tenant $tenantid -SubscriptionId $subscriptionid 

### create resource group
New-AzResourceGroup -Name $resourcegroupname -Location $region

### deploy the resource
New-AzResourceGroupDeployment -ResourceGroupName $resourcegroupname -TemplateUri https://raw.githubusercontent.com/Azure-Samples/azure-health-data-and-ai-samples/main/samples/fhir-aad-b2c/b2c-arm-template.json -b2cName $b2cNa

将测试 B2C 用户添加到 Azure AD B2C 租户

需要测试 B2C 用户来与 FHIR 服务中的特定患者资源关联,并验证身份验证流是否按预期工作。

  1. 在 Azure 门户中,转到 B2C 资源。 选择“打开 B2C 租户”。

    显示 B2C 资源的屏幕截图。

  2. 在左侧窗格中,选择“用户”。

    显示家庭用户的屏幕截图。

  3. 选择“+ 新建用户”。

    显示添加新用户的屏幕截图。

fhirUser 自定义用户属性用于将 B2C 用户与 FHIR 服务中的用户资源链接起来。 在这个例子中,在 B2C 租户中创建了名为“Test Patient1”的用户,在后面的步骤中,在 FHIR 服务中创建了患者资源。 通过将 fhirUser 属性值设置为患者资源标识符,将 Test Patient1 用户链接到患者资源。 有关自定义用户属性的更多信息,请参阅 Azure Active Directory B2C 中的用户流自定义属性

  1. Azure AD B2C 页面的左侧窗格中,选择“用户属性”。

  2. 选择“+添加

  3. 在“名称”字段中,输入“fhirUser”(区分大小写)。

  4. 从“数据类型”选择列表中,选择“字符串”。

  5. 选择“创建”

    显示 B2C 属性的屏幕截图。

创建新 B2C 用户流

用户流定义了用户登录时必须遵循的步骤序列。 在这个例子中定义了用户流,以便当用户登录时,提供的访问令牌包括 fhirUser 声明。 有关详细信息,请参阅在 Azure Active Directory B2C 中创建用户流和自定义策略

  1. Azure AD B2C 页面的左侧窗格中,选择“用户流”。

  2. 选择“+ 新建用户流”。

    显示 B2C 用户流的屏幕截图。

  3. 为用户流提供 B2C 租户唯一的名称。 (名称不必全局唯一。)在本例中,用户流的名称为 USER_FLOW_1。 记下这个名字。

  4. 确保为本地帐户启用了电子邮件登录,以便测试用户可以登录并获得 FHIR 服务的访问令牌。

    显示 B2C 用户流配置的屏幕截图。

  5. 在“创建用户流”页面上,滚动至第 5 节。应用程序声明 ,然后选择“显示更多...”以显示所有可用索赔的列表。

  6. 选择 fhirUser 声明。

  7. 选择“确定”

  8. 选择“创建”

    显示 B2C 用户流配置与 FHIR 用户声明的屏幕截图。

创建新的 B2C 资源应用程序

B2C 资源应用程序处理从医疗保健应用程序到 Azure Active Directory B2C 的身份验证请求。

  1. Azure AD B2C 页面的左侧窗格中,选择“应用注册”。

  2. 选择“+ 新注册”。

    显示 B2C 新应用程序的屏幕截图。

  3. 输入显示名称。 此示例使用 FHIR 服务

  4. 在“支持的帐户类型”列表中,选择任何标识提供者或组织目录中的“帐户”(用于使用用户流验证用户)

  5. 重定向 URI (推荐) 选择列表中,选择*公共客户端/本地(移动和桌面)。 使用 Postman 调用 URI https://oauth.pstmn.io/v1/callback 填充该值。 调用 URI 用于测试目的。

  6. 在“权限”部分,选择“授予管理员对 openid 和 offline_access 权限的同意”。

  7. 选择“注册”。 等待应用程序注册完成。 浏览器会自动导航到应用程序“概述”页面。

    显示 B2C 应用程序注册的屏幕截图。

配置应用的 API 权限

  1. 在左侧窗格的“应用注册”页面上,选择“清单”。

  2. 滚动直到找到 oauth2Permissions 数组。 将数组替换为 oauth2Permissions.json 文件中的一个或多个值。 复制整个数组或单个权限。

    如果向列表添加权限,B2C 租户中的任何用户都可以获得具有 API 权限的访问令牌。 如果某个访问级别不适合 B2C 租户中的用户,请勿添加到数组中,因为没有办法将权限限制在用户的子集。

  3. 填充 oauth2Permissions 数组后,选择“保存”。

    显示 B2C 应用程序清单的屏幕截图。

公开 Web API 并分配应用程序 ID URI

  1. 在左窗格的“应用注册”页面上,选择“公开 API”。

  2. 选择“添加” 。

  3. 默认情况下,应用程序 ID URI 字段由应用程序(客户端)ID 填充。 如果需要,请更改该值。 在本例中,值为“fhir”。

  4. 选择“保存”

    显示 B2C 应用程序 API 的屏幕截图。

  5. 在左侧窗格中的“应用注册”页面上,选择“API 权限”。

  6. 选择“+ 添加权限”。

    显示 B2C API 权限的屏幕截图。

  7. 在“请求 API 权限”窗格中,选择“我的组织使用的 API”。

  8. 从列表中选择资源应用程序。

    显示 B2C API 权限与所用 API 的屏幕截图。

  9. 在“患者”部分的“请求 API 权限”窗格中,选择至少一个权限。 在本例中,选择了权限 patient.all.read,这表示请求具有范围 patient.all.read 的访问令牌的用户具有患者隔离舱 (patient.all.read) 中所有 FHIR (patient.all.read) 资源的“读取”权限 (patient.all.read)。有关更多信息,请参阅“患者隔离舱”。

  10. 选择“添加权限”。

    显示 B2C API 权限与所添加权限的屏幕截图。

  11. API 权限页的“已配置权限”部分中,选择“授予管理员同意”。

    显示需要管理员同意的 B2C API 权限的屏幕截图。

以 Azure Active Directory B2C 作为标识提供者部署 FHIR 服务

以 Azure Active Directory B2C 作为标识提供者部署 FHIR 服务,允许 FHIR 服务根据用户的 Azure AD B2C 凭据对用户进行身份验证,确保只有授权用户才能访问敏感患者信息

获取 B2C 权限和客户 ID

使用权限客户端 ID(或应用程序 ID)参数将 FHIR 服务配置为使用 Azure AD B2C 租户作为标识提供者。

  1. 使用 B2C 租户名称和用户流名称创建权限字符串。

    https://<YOUR_B2C_TENANT_NAME>.b2clogin.com/<YOUR_B2C_TENANT_NAME>.onmicrosoft.com/<YOUR_USER_FLOW_NAME>/v2.0
    
  2. 通过向 .well-known/openid-configuration 端点发出请求来测试权限字符串。 在浏览器中输入字符串以确认其导航到 OpenId 配置 JSON 文件。 如果 OpenId 配置 JSON 加载失败,请确保 B2C 租户名称和用户流名称正确无误。

    https://<YOUR_B2C_TENANT_NAME>.b2clogin.com/<YOUR_B2C_TENANT_NAME>.onmicrosoft.com/<YOUR_USER_FLOW_NAME>/v2.0/.well-known/openid-configuration
    
  3. 从资源应用程序概述页面中检索客户端 ID。

    显示 B2C 应用程序概述页面的屏幕截图。

使用 ARM 模板部署 FHIR 服务

使用 ARM 模板来简化 FHIR 服务的部署。 使用 PowerShell 或 Azure CLI 将 ARM 模板部署到 Azure 订阅。

在 Azure Cloud Shell 或 PowerShell 中的 Visual Studio Code 本地运行代码,将 FHIR 服务部署到 Azure AD B2C 租户。

  1. 使用 Connect-AzAccount 以登录到 Azure。 使用 Get-AzContext 验证要使用的订阅和租户。 如果需要,请更改订阅和租户。

  2. 创建新资源组,或者通过跳过步骤或注释禁止以 New-AzResourceGroup 开头的行来使用现有的资源组。

### variables
$tenantid="your tenant id"
$subscriptionid="your subscription id"
$resourcegroupname="your resource group name"
$region="your desired region"
$workspacename="your workspace name"
$fhirServiceName="your fhir service name"
$smartAuthorityUrl="your authority (from previous step)"
$smartClientId="your client id (from previous step)"

### login to azure
Connect-AzAccount 
#Connect-AzAccount SubscriptionId $subscriptionid
Set-AzContext -Subscription $subscriptionid
Connect-AzAccount -Tenant $tenantid -SubscriptionId $subscriptionid
#Get-AzContext 

### create resource group
New-AzResourceGroup -Name $resourcegroupname -Location $region

### deploy the resource
New-AzResourceGroupDeployment -ResourceGroupName $resourcegroupname -TemplateUri https://raw.githubusercontent.com/Azure-Samples/azure-health-data-and-ai-samples/main/samples/fhir-aad-b2c/fhir-service-arm-template.json -tenantid $tenantid -region $region -workspaceName $workspacename -fhirServiceName $fhirservicename -smartAuthorityUrl $smartAuthorityUrl -smartClientId $smartClientId

验证 Azure AD B2C 用户是否能够访问 FHIR 资源

验证过程包括在 FHIR 服务中创建患者资源,将患者资源链接到 Azure AD B2C 用户,并配置 Postman 以获得 B2C 用户的访问令牌。 验证过程完成后,可以使用 B2C 测试用户获取患者资源。

运行 Postman 以获取访问令牌

在本地或 web 浏览器中运行 Postman 应用程序。 有关获得 FHIR 服务的正确访问权限的步骤,请参阅使用 Postman 访问 FHIR 服务

按照 GET FHIR 资源部分的步骤进行操作时,请求会返回空响应,因为 FHIR 服务是新的,没有任何患者资源。

在 FHIR 服务中创建患者资源

需要注意的是,B2C 租户中的用户在链接到 FHIR 资源之前无法读取任何资源,例如作为患者或专业人员。 在 FHIR 服务所在的 Microsoft Entra ID 中具有 FhirDataWriterFhirDataContributor 角色的用户必须执行此步骤。

  1. 通过将方法更改为 PUT 并使用此正文执行对 {{fhirurl}}/Patient/1 的请求,创建具有特定标识符的患者:
{
    "resourceType": "Patient",
    "id": "1",
    "name": [
        {
            "family": "Patient1",
            "given": [
                "Test"
            ]
        }
    ]
}
  1. 通过将方法更改回 GET 并验证对 {{fhirurl}}/Patient 的请求是否返回了新建患者,来验证是否创建了患者。

需要在 B2C 租户中的测试用户和 FHIR 服务中的资源之间创建显示链接。 使用 Microsoft Graph 中的“扩展属性”创建链接。 有关详细信息,请参阅在在 Azure Active Directory B2C 中定义自定义属性

  1. 转到 B2C 租户。 在左侧窗格中,选择“应用注册”。

  2. 选择“所有应用程序”。

  3. 选择前缀为 b2c-extensions-app 的应用。

    显示 B2C 应用列表的屏幕截图。

  4. 请记下“应用程序 (客户端) ID”值。

    显示 B2C 扩展应用的屏幕截图。

  5. 导航回 B2C 租户主页,在左侧窗格中选择“用户”。

    显示 B2C 家庭用户的屏幕截图。

  6. 选择“Test Patient1”。

    显示 B2C 用户列表的屏幕截图。

  7. 注意对象 ID 值。

    显示 B2C 用户 ID 的屏幕截图。

  8. 打开 Microsoft Graph Explorer。 使用分配给 B2C 租户的全局管理员角色的用户登录。 (最好在 B2C 租户中新建管理员用户来管理租户中的用户。)

    显示 Graph 登录的屏幕截图。

  9. 选择用户的头像,然后选择“同意权限”。

    显示适用于测试用户的 Graph 同意的屏幕截图。

  10. 滚动到“用户”。 同意 User.ReadWrite.All。 此权限允许使用 fhirUser 声明值更新 Test Patient1 用户。

    显示适用于 FHIR 用户声明的 Graph 同意的屏幕截图。

  11. 同意过程完成后,请更新用户。 需要 b2c-extensions-app 应用程序(客户端)ID 和用户对象 ID。

    • 将方法更改为 PATCH

    • 将 URL 更改为 https://graph.microsoft.com/v1.0/users/{USER_OBJECT_ID}

    • 创建 PATCH 正文。 PATCH 本文是单个键值对,其中密钥格式为 extension_{B2C_EXTENSION_APP_ID_NO_HYPHENS}_fhirUser,值为患者 https://{YOUR_FHIR_SERVICE}.azurehealthcareapis.com/Patient/1" 的完全合格 FHIR 资源 ID。

    有关详细信息,请参见通过 Microsoft Graph 管理扩展属性

  12. 格式化请求后,选择“运行查询”。 等待成功响应,其确认 B2C 租户中的用户链接到 FHIR 服务中的患者资源。

    显示 Graph 补丁的屏幕截图。

配置 Postman 以获取 B2C 用户的访问令牌

获取访问令牌以测试身份验证流。

  1. 启动 Postman 应用程序,然后创建新 Blank 集合。 在本例中,集合名为 FHIR 患者

    显示 Postman 新集合的屏幕截图。

  2. 在集合概述中选择“授权”选项卡。

  3. 在“类型”选择列表中,选择“OAuth 2.0”。

    显示 Postman 身份验证的屏幕截图。

  4. 滚动到“配置新令牌”部分,并输入以下值:

    • 调用 URL。 此值是在创建 B2C 资源应用程序时配置的。

      https://oauth.pstmn.io/v1/callback
      
    • Auth URL。 此值可以使用 B2C 租户的名称和用户流的名称创建。

      https://{YOUR_B2C_TENANT_NAME}.b2clogin.com/{YOUR_B2C_TENANT_NAME}.onmicrosoft.com/{YOUR_USER_FLOW_NAME}/oauth2/v2.0/authorize
      
    • 访问令牌 URL。 此值可以使用 B2C 租户的名称和用户流的名称创建。

      https://{YOUR_B2C_TENANT_NAME}.b2clogin.com/{YOUR_B2C_TENANT_NAME}.onmicrosoft.com/{YOUR_USER_FLOW_NAME}/oauth2/v2.0/token
      
    • 客户端 ID。 此值是 B2C 资源应用程序的应用程序(客户端)ID。

      {YOUR_APPLICATION_ID}
      
    • 范围。 此值在 B2C 资源应用程序的“公开 API”部分中定义。 授予权限的范围是 patient.all.read。 范围请求必须是完全限定的 URL,例如 https://testb2c.onmicrosoft.com/fhir/patient.all.read

  5. 从 B2C 资源应用程序的“公开 API”部分复制完全限定的范围。

    {YOUR_APPLICATION_ID_URI}/patient.all.read
    

    显示 Postman URL 的屏幕截图。

使用 B2C 用户获取患者资源

验证 Azure AD B2C 用户是否可以访问 FHIR 资源。

  1. 当 Postman 中的授权配置设置为启动 B2C 用户流时,选择“获取新访问令牌”以获取访问令牌。

    显示 Postman 获取访问令牌的屏幕截图。

  2. 使用 Test Patient 凭据登录。

    显示 Postman 获取令牌的屏幕截图。

  3. 选择“使用令牌”可将访问令牌用于集合中的任何请求。

    显示 Postman 使用令牌的屏幕截图。

  4. 创建新的请求来搜索 FHIR 服务中的患者资源。 选择集合名称旁边的省略号按钮 (...),然后选择“添加请求”。

    显示已添加 Postman 请求的屏幕截图。

  5. 将方法设置为 GET,输入完全限定的 FHIR 服务 URL,然后添加路径 /Patient

  6. 选择“发送”。

  7. 验证响应是否包含单个患者资源。

    显示 Postman 请求响应的屏幕截图。

后续步骤

配置多个标识提供者

排查标识提供者配置问题

注意

FHIR® 是 HL7 的注册商标,经 HL7 许可使用。