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

Azure API for FHIR 访问令牌验证

Azure API for FHIR 验证访问令牌的方式取决于实现和配置。 在本文中,我们将演练验证步骤,这些步骤在排查访问问题时非常有用。

验证令牌是否不存在标识提供者相关的问题

令牌验证的第一步是验证该令牌是否由正确的标识提供者颁发并且尚未修改。 FHIR 服务器将配置为使用称作颁发机构 Authority 的特定标识提供者。 FHIR 服务器将从 /.well-known/openid-configuration 终结点检索有关标识提供者的信息。 使用 Azure Active Directory (Azure AD) 时,完整 URL 为:

GET https://login.microsoftonline.com/<TENANT-ID>/.well-known/openid-configuration

其中,<TENANT-ID> 是特定的 Azure AD 租户(租户 ID 或域名)。

Azure AD 会将此类文档返回到 FHIR 服务器。

{
    "authorization_endpoint": "https://login.microsoftonline.com/<TENANT-ID>/oauth2/authorize",
    "token_endpoint": "https://login.microsoftonline.com/<TENANT-ID>/oauth2/token",
    "token_endpoint_auth_methods_supported": [
        "client_secret_post",
        "private_key_jwt",
        "client_secret_basic"
    ],
    "jwks_uri": "https://login.microsoftonline.com/common/discovery/keys",
    "response_modes_supported": [
        "query",
        "fragment",
        "form_post"
    ],
    "subject_types_supported": [
        "pairwise"
    ],
    "id_token_signing_alg_values_supported": [
        "RS256"
    ],
    "http_logout_supported": true,
    "frontchannel_logout_supported": true,
    "end_session_endpoint": "https://login.microsoftonline.com/<TENANT-ID>/oauth2/logout",
    "response_types_supported": [
        "code",
        "id_token",
        "code id_token",
        "token id_token",
        "token"
    ],
    "scopes_supported": [
        "openid"
    ],
    "issuer": "https://sts.windows.net/<TENANT-ID>/",
    "claims_supported": [
        "sub",
        "iss",
        "cloud_instance_name",
        "cloud_instance_host_name",
        "cloud_graph_host_name",
        "msgraph_host",
        "aud",
        "exp",
        "iat",
        "auth_time",
        "acr",
        "amr",
        "nonce",
        "email",
        "given_name",
        "family_name",
        "nickname"
    ],
    "microsoft_multi_refresh_token": true,
    "check_session_iframe": "https://login.microsoftonline.com/<TENANT-ID>/oauth2/checksession",
    "userinfo_endpoint": "https://login.microsoftonline.com/<TENANT-ID>/openid/userinfo",
    "tenant_region_scope": "WW",
    "cloud_instance_name": "microsoftonline.com",
    "cloud_graph_host_name": "graph.windows.net",
    "msgraph_host": "graph.microsoft.com",
    "rbac_url": "https://pas.windows.net"
}

FHIR 服务器的重要属性为 jwks_uri(告知服务器要从何处提取用于验证令牌签名的加密密钥)和 issuer(告知服务器要在此服务器颁发的令牌的颁发者声明 (iss) 中包含哪些内容)。 FHIR 服务器可以使用它来验证它是否收到可信令牌。

验证令牌的声明

服务器验证令牌的真实性后,FHIR 服务器将继续验证客户端是否具有访问令牌所需的声明。

使用 Azure API for FHIR 时,服务器将验证:

  1. 令牌是否包含适当的 Audienceaud 声明)。
  2. 允许该令牌的目标用户或主体访问 FHIR 服务器数据平面。 令牌的 oid 声明包含用于唯一标识该用户或主体的标识对象 ID。

建议将 FHIR 服务配置为使用 Azure RBAC 来管理数据平面角色分配。 但是,如果 FHIR 服务使用外部或辅助 Azure AD 租户,也可以 配置本地 RBAC

使用适用于 Azure 的 OSS Microsoft FHIR 服务器时,服务器将验证:

  1. 令牌是否包含适当的 Audienceaud 声明)。
  2. 令牌的 roles 声明中包含一个有权访问 FHIR 服务器的角色。

请查阅有关如何在 FHIR 服务器上定义角色的详细信息。

FHIR 服务器还可以验证访问令牌是否包含用于访问客户端正在尝试访问的 FHIR API 部分的范围(在令牌声明 scp中)。 目前,Azure API for FHIR 和适用于 Azure 的 FHIR 服务器不会验证令牌范围。

后续步骤

了解如何完成令牌验证后,可以完成创建 JavaScript 应用程序的教程,并阅读 Fast Healthcare Interoperability Resources (FHIR®) 数据。

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