

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 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` （未在時間之前）：如果存在，HealthImaging 可確保權杖在有效開始時間之前不會被使用。

1. **HealthImaging 會叫用 Lambda 授權方：**如果初始宣告驗證通過，則 HealthImaging 會將進一步的權杖驗證委派給客戶設定的 Lambda 授權方函數。HealthImaging 會將擷取的字符和其他相關請求資訊傳遞給 Lambda 函數。Lambda 函數會驗證字符的簽章和宣告。

1. **向身分提供者驗證：**Lambda 包含自訂程式碼，可檢查 ID 權杖簽章、執行更廣泛的權杖驗證 （例如發行者、對象、自訂宣告），並視需要針對 IdP 驗證這些宣告。

1. **授權方傳回存取政策：**驗證成功後，Lambda 函數會決定已驗證使用的適當許可。然後，Lambda 授權方會傳回 IAM 角色的 amazon 資源名稱 (ARN)，代表要授予的一組許可。

1. **請求執行：**如果擔任的 IAM 角色具有必要的許可，HealthImaging 會繼續傳回請求的 DICOMWeb 資源。如果許可不足，HealthImaging 會拒絕請求並傳回適當的錯誤回應錯誤 （即 403 禁止）。

**注意**  
授權方 lambda 函數不是由 AWS HealthImaging 服務管理。它會在您的 AWS 帳戶中執行。系統會分別向客戶收取函數呼叫和執行時間的費用，以及其 HealthImaging 費用。

## 架構概觀
<a name="dicomweb-oidc-architecture-overview"></a>

![\[顯示工作流程的圖表：用戶端傳送字符、Lambda 授權方驗證、HealthImaging 程序請求\]](http://docs.aws.amazon.com/zh_tw/healthimaging/latest/devguide/images/security-oidc-workflow-lambda.png)


## 先決條件
<a name="dicomweb-oidc-prerequisites"></a>

### 存取字符要求
<a name="dicomweb-oidc-token-requirements"></a>

HealthImaging 要求存取權杖採用 JSON Web Token (JWT) 格式。許多身分提供者 (IDPs) 原生提供此字符格式，而其他身分提供者則允許您選取或設定存取權杖表單。在繼續整合之前，請確定您選擇的 IDP 可以發出 JWT 字符。

權杖格式  
存取權杖必須是 JWT (JSON Web Token) 格式

必要宣告    
`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 Web 金鑰集）
+ 盡可能快取有效的存取權杖
+ 將對身分提供者的網路呼叫降至最低
+ 實作有效率的權杖驗證邏輯

### Lambda 組態
<a name="dicomweb-oidc-lambda-configuration"></a>
+ Python 和 Node.js 型函數通常會更快速地初始化
+ 減少要載入的外部程式庫數量
+ 設定適當的記憶體配置，以確保一致的效能
+ 使用 CloudWatch 指標監控執行時間

## OIDC 身分驗證啟用
<a name="dicomweb-oidc-enablement"></a>
+ **只有在**建立新的****資料存放區時，才能啟用 OIDC 身分驗證
+ API 不支援為現有資料存放區啟用 OIDC
+ 若要在現有資料存放區上啟用 OIDC，客戶必須聯絡 AWS Support