

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Lambda 授权方进行自定义令牌验证
<a name="dicomweb-oidc-how"></a>

HealthImaging 通过使用 Lambda 授权方的架构实现 OIDC 支持，允许客户实现自己的令牌验证逻辑。这种设计使您可以灵活控制令牌的验证方式以及访问决策的执行方式，同时适应了兼容 OIDC 的身份提供商 (IdPs) 的多样化格局和不同的令牌验证方法。

## 身份验证流程
<a name="dicomweb-oidc-authentication-flow"></a>

以下是身份验证的高级工作原理：

1. **客户端调用 DICOMweb API：**您的应用程序使用您选择的 OIDC 身份提供商进行身份验证并收到签名 ID 令牌 (JWT)。对于每个 DICOMweb HTTP 请求，客户端必须在授权标头中包含 OIDC 访问令牌（通常是持有者令牌）。在请求到达您的数据之前，从传入的请求中 HealthImaging 提取此令牌并调用您配置的 Lambda 授权方。

   1. 标题通常遵循以下格式:`Authorization: Bearer <token>`.

1. **初始验证： HealthImaging 验证**访问令牌声明，以便快速拒绝任何明显无效或过期的令牌，而无需不必要地调用 Lambda 函数。 HealthImaging 在调用 Lambda 授权方之前，对访问令牌中的某些标准声明进行初步验证：

   1. `iat`（发行时间）： HealthImaging 检查代币的发行时间是否在可接受的范围内。

   1. `exp`（到期时间）： HealthImaging 验证令牌是否未过期。

   1. `nbf`（Not Before Time）：如果存在，则 HealthImaging 确保令牌在其有效开始时间之前未被使用。

1. **HealthImaging 调用 Lambda 授权方：如果初始声明验证通过， HealthImaging 则将进一步的令牌验证委托给客户配置的 L** ambda 授权方函数。 HealthImaging 将提取的令牌和其他相关请求信息传递给 Lambda 函数。Lambda 函数验证令牌的签名和声明。

1. 向@@ **身份提供者验证：**Lambda 包含自定义代码，用于检查 ID 令牌签名，执行更广泛的令牌验证（例如颁发者、受众、自定义声明），并在必要时对 IdP 验证这些声明。

1. A@@ **uthorizer 返回访问策略：**成功验证后，Lambda 函数将确定经过身份验证的用户的相应权限。然后，Lambda 授权方返回一个 IAM 角色的亚马逊资源名称 (ARN)，该角色代表要授予的权限集。

1. **请求执行：**如果代入的 IAM 角色具有必要的权限 HealthImaging ，则继续返回请求的 DICOMWeb 资源。如果权限不足，则 HealthImaging 拒绝请求并返回相应的错误响应错误（即 403 Forbidden）。

**注意**  
授权方 lambda 函数不是由 AWS HealthImaging 服务管理的。它在你的 AWS 账户中执行。向客户收取函数调用和执行时间的费用与其 HealthImaging 费用分开收费。

## 架构概述
<a name="dicomweb-oidc-architecture-overview"></a>

![\[显示工作流程的示意图：客户发送令牌、Lambda 授权者验证、处理请求 HealthImaging\]](http://docs.aws.amazon.com/zh_cn/healthimaging/latest/devguide/images/security-oidc-workflow-lambda.png)


## 先决条件
<a name="dicomweb-oidc-prerequisites"></a>

### 访问令牌要求
<a name="dicomweb-oidc-token-requirements"></a>

HealthImaging 要求访问令牌采用 JSON 网络令牌 (JWT) 格式。许多身份提供商 (IDPs) 本身就提供这种令牌格式，而其他身份提供者则允许您选择或配置访问令牌表单。在继续集成之前，请确保您选择的 IDP 可以发放 JWT 代币。

标记格式  
访问令牌必须采用 JWT（JSON 网络令牌）格式

所需声明    
`exp`（到期时间）  
必填声明，用于指定令牌何时失效。  
+ 必须晚于 UTC 中的当前时间
+ 表示令牌何时失效  
`iat`（发布于）  
必填声明，用于指定令牌的发行时间。  
+ 必须早于 UTC 中的当前时间
+ 不得早于当前时间（UTC）前 12 小时
+ 这实际上强制令牌的最大生命周期为 12 小时  
`nbf`（不在时间之前）  
可选声明，用于指定令牌的最早使用时间。  
+ 如果存在，将由以下人员进行评估 HealthImaging
+ 指定在此之前不得接受令牌的时间

### Lambda 授权方响应时间要求
<a name="dicomweb-oidc-lambda"></a>

HealthImaging 对 Lambda 授权方响应强制执行严格的计时要求，以确保最佳 API 性能。您的 Lambda 函数**必须在 1 秒**钟内返回。

## 最佳实践
<a name="dicomweb-oidc-best-practices"></a>

### 优化令牌验证
<a name="dicomweb-oidc-optimization"></a>
+ 尽可能缓存 JWKS（JSON 网络密钥集）
+ 尽可能缓存有效的访问令牌
+ 尽量减少对身份提供商的网络呼叫
+ 实现高效的代币验证逻辑

### Lambda 配置
<a name="dicomweb-oidc-lambda-configuration"></a>
+ 基于 Python 和 Node.js 的函数的初始化速度通常更快
+ 减少要加载的外部库数量
+ 配置适当的内存分配以确保一致的性能
+ 使用 CloudWatch 指标监控执行时间

## OIDC 身份验证启用
<a name="dicomweb-oidc-enablement"></a>
+ **只有****在创建新的数据存储时才能启用 OIDC 身份验证**
+ API 不支持为现有数据存储启用 OIDC
+ 要在现有数据存储上启用 OIDC，客户必须联系 Support AWS 