你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Azure 健康数据服务的身份验证和授权
身份验证
Azure Health Data Services 是使用 Microsoft Entra ID(支持 OAuth 2.0 的全球标识提供者)的受保护托管服务的集合。
要使 Azure Health Data Services 能够访问 Azure 资源(例如存储帐户和事件中心),需要启用系统托管的标识,并向该托管标识授予适当的权限。 有关详细信息,请参阅 Azure 托管标识。
客户端应用程序在 Microsoft Entra ID 中注册,可用于访问 Azure Health Data Services。 用户数据访问控制是在实现业务逻辑的应用程序或服务中进行的。
应用程序角色
必须为经过身份验证的 Azure Health Data Services 用户和客户端应用程序分配适当的应用程序角色。
Azure Health Data Services 中的 FHIR® 服务提供以下角色:
- FHIR 数据读者:读取和搜索 FHIR 数据。
- FHIR 数据写入者:读取、写入和软删除 FHIR 数据。
- FHIR 数据导出者:读取并导出($export 运算符)数据。
- FHIR 数据导入者:读取和导入($import 运算符)数据。
- FHIR 数据参与者:执行所有数据平面操作。
- FHIR 数据转换器:使用转换器执行数据转换。
- FHIR SMART 用户:允许用户根据 SMART IG V1.0.0 规范读取和写入 FHIR 数据。
Azure Health Data Services 中的 DICOM® 服务提供以下角色:
- DICOM 数据所有者:读取、写入和删除 DICOM 数据。
- DICOM 数据读取:读取 DICOM 数据。
医疗技术服务不需要应用程序角色,但它确实依赖 Azure 事件中心数据接收器来检索存储在组织订阅的事件中心中的数据。
授权
在获得适当的应用程序角色后,经过身份验证的用户和客户端应用程序可以通过获取 Microsoft Entra ID 颁发的有效访问令牌来访问 Azure 健康数据服务,并执行应用程序角色定义的特定操作。
- 对于 FHIR 服务,访问令牌特定于服务或资源。
- 对于 DICOM 服务,系统会向
dicom.healthcareapis.azure.com
资源授予访问令牌,而不是特定服务。 - 对于医疗技术服务,不需要访问令牌,因为系统不会向用户或客户端应用程序公开该令牌。
授权步骤
获取访问令牌有两种常见方法,Microsoft Entra 文档对此进行了详细概述:授权代码流和客户端凭据流。
以下是使用授权代码流程获取 Azure Health Data Services 的访问令牌的方法:
客户端将请求发送到 Microsoft Entra 授权终结点。 Microsoft Entra ID 将客户端重定向到登录页面,用户将在这里使用相应的凭据(例如,用户名加密码或双因素身份验证)进行身份验证。 成功完成身份验证后,授权代码将返回到客户端。 Microsoft Entra 只允许将此授权代码返回到在客户端应用程序注册中配置的注册回复 URL。
客户端应用程序在 Microsoft Entra 令牌终结点处交换访问令牌的授权代码。 当客户端应用程序请求令牌时,应用程序可能必须提供客户端密码(可以在应用程序注册期间添加)。
客户端向 Azure Health Data Services 发出请求,例如,发出
GET
请求以搜索 FHIR 服务中的所有患者。 请求在HTTP
请求标头中包含访问令牌,例如Authorization: Bearer xxx
。Azure Health Data Services 验证令牌是否包含相应声明(令牌中的属性)。 如果有效,它将完成请求并向客户端返回数据。
在客户端凭据流中,系统会直接向应用程序本身授予权限。 当应用向资源出示令牌时,资源强制应用本身具有执行操作的授权,因为没有用户参与身份验证。 因此,它与授权码流程有以下不同:
- 用户或客户端不需要以交互方式登录。
- 不需要授权代码。
- 访问令牌是直接通过应用程序权限获取的。
访问令牌
访问令牌是经过签名的 Base64 编码的属性(声明)集合,可在其中了解客户端标识、角色以及授予用户或客户端的特权。
Azure Health Data Services 通常需要 JSON Web 令牌。 该令牌由三个部分组成:
- 头文件
- 有效负载(声明)
- 签名,如下图所示。 有关详细信息,请参阅 Azure 访问令牌。
使用联机工具,例如 https://jwt.ms 查看令牌内容。 例如,可以查看声明详细信息。
声明类型 | 值 | 说明 |
---|---|---|
aud | https://xxx.fhir.azurehealthcareapis.com | 标识令牌的目标接收方。 在 id_tokens 中,受众是在 Azure 门户中分配给应用的应用程序 ID。 你的应用应该验证此值。如果此值不匹配,则应该拒绝该令牌。 |
iss | https://sts.windows.net/{tenantid}/ | 标识构造并返回令牌的安全令牌服务 (STS),以及对用户进行身份验证的 Microsoft Entra 租户。 如果令牌由 v2.0 终结点颁发,则 URI 以 /v2.0 结尾。 表示用户是来自 Microsoft 帐户的使用者用户的 GUID 为 9188040d-6c67-4c5b-b112-36a304b66dad 。 应用应该使用声明的 GUID 部分限制可登录应用的租户集(如果适用)。 |
iat | (时间戳) | “Issued At”表示针对此令牌进行身份验证的时间。 |
nbf | (时间戳) | “nbf”(不早于)声明指定只能在哪个时间之后接受 JWT 的处理。 |
exp | (时间戳) | “exp”(过期时间)声明指定只能在哪个时间(含)之前接受 JWT 的处理。 资源也可以在此时间之前拒绝令牌,例如,需要对身份验证进行更改,或者检测到令牌已吊销。 |
aio | E2ZgYxxx | 一个内部声明,由 Microsoft Entra ID 用来记录数据,以便重用令牌。 应忽略。 |
appid | e97e1b8c-xxx | 使用令牌的客户端的应用程序 ID。 该应用程序可以自身名义或者代表用户进行操作。 应用程序 ID 通常表示应用程序对象,但它还可以表示 Microsoft Entra ID 中的服务主体对象。 |
appidacr | 1 | 表示对客户端进行身份验证的方式。 对于公共客户端,该值为 0。 如果使用客户端 ID 和客户端机密,则该值为 1。 如果使用客户端证书进行身份验证,值为 2。 |
idp | https://sts.windows.net/{tenantid}/ | 记录对令牌使用者进行身份验证的标识提供者。 除非用户帐户与颁发者不在同一租户中(例如,来宾),否则此值与颁发者声明的值相同。 如果声明不存在,则意味着可以改用 iss 的值。 对于在组织上下文中使用的个人帐户(例如,受邀加入 Microsoft Entra 租户的个人帐户),idp 声明可能是“live.com”或包含 Microsoft 帐户租户 9188040d-6c67-4c5b-b112-36a304b66dad 的 STS URI。 |
oid | 例如,tenantid | 在 Microsoft 标识系统中,对象的不可变标识符在这种情况下是用户帐户。 此 ID 唯一标识应用程序中的用户 - 同一个用户登录两个不同的应用程序会在 oid 声明中收到相同值。 Microsoft Graph 会返回此 ID 作为给定用户帐户的 ID 属性。 因为 oid 允许多个应用关联用户,需要配置文件作用域才能收到此声明。 请注意:如果一个用户存在于多个租户中,该用户在每个租户中都有一个不同的对象 ID - 它们将视为不同帐户,即使用户使用相同的凭据登录到每个帐户,也是如此。 |
rh | 0.ARoxxx | Azure 用来重新验证令牌的内部声明。 应忽略。 |
sub | 例如,tenantid | 令牌针对其断言信息的主体,例如应用的用户。 此值是不可变的,无法重新分配或重复使用。 使用者是成对标识符 - 它对特定应用程序 ID 是唯一的。 因此,如果单个用户使用两个不同的客户端 ID 登录到两个不同的应用,这些应用将收到两个不同的使用者声明值。 根据体系结构和隐私要求,不一定需要此结果。 |
tid | 例如,tenantid | GUID 代表用户所属的 Microsoft Entra ID 租户。 对于工作和学校帐户,此 GUID 就是用户所属组织的不可变租户 ID。 对于个人帐户,该值为 9188040d-6c67-4c5b-b112-36a304b66dad。 需要配置文件范围才能接收此声明。 |
uti | bY5glsxxx | Azure 用来重新验证令牌的内部声明。 应忽略。 |
ver | 1 | 指示令牌的版本。 |
默认情况下,访问令牌有效期为 1 小时。 可以在令牌过期之前获取新令牌或使用刷新令牌对其进行续订。
若要获取访问令牌,可以使用 Postman、Visual Studio Code 中的 REST 客户端扩展、PowerShell、CLI、curl 和 Microsoft Entra 身份验证库等工具。
加密
创建 Azure Health Data Services 的新服务时,默认将使用 Microsoft 托管的密钥来加密你的数据。
- 当数据保存在数据存储中时,FHIR 服务提供静态数据加密。
- 当包括嵌入元数据的成像数据保留在数据存储中时,DICOM 服务提供静态数据加密。 提取元数据并将其保存在 FHIR 服务中时,系统会自动对其进行加密。
- 经过数据映射和规范化后,医疗技术服务会将设备消息保存到自动加密的 FHIR 服务中。 如果将设备消息发送到使用 Azure 存储来存储数据的 Azure 事件中心,系统会使用 Azure 存储服务加密 (Azure SSE) 自动对数据执行加密处理。