AcceptSecurityContext (Kerberos) 函式可讓傳輸應用程式的伺服器元件在伺服器與遠端用戶端之間建立安全性內容。 遠端用戶端會使用 InitializeSecurityContext (Kerberos) 函式來啟動建立 安全性內容的程式。 伺服器可能需要來自遠端用戶端的一或多個回復令牌,才能完成建立 安全性內容。
語法
SECURITY_STATUS SEC_Entry AcceptSecurityContext(
_In_opt_ PCredHandle phCredential,
_In_opt_ PCtxtHandle phContext,
_In_opt_ PSecBufferDesc pInput,
_In_ ULONG fContextReq,
_In_ ULONG TargetDataRep,
_Inout_opt_ PCtxtHandle phNewContext,
_Inout_opt_ PSecBufferDesc pOutput,
_Out_ PULONG pfContextAttr,
_Out_opt_ PTimeStamp ptsExpiry
);
參數
phCredential 認證[in, optional]
伺服器的認證句柄。 伺服器會呼叫 AcquireCredentialsHandle (Kerberos) 函式,並將SECPKG_CRED_INBOUND或SECPKG_CRED_BOTH旗標設定為擷取此句柄。
phContext[in, out, optional]
CtxtHandle 結構的指標。 在第一次呼叫 AcceptSecurityContext (Kerberos)時,此指標為 NULL。 在後續的呼叫中,phContext 是第一次呼叫在 phNewContext 參數中傳回之部分格式內容的句柄。
警告
請勿在 AcceptSecurityContext (Kerberos) 的並行呼叫中使用相同的內容句柄。 安全性服務提供者中的 API 實作不是安全線程。
pInput[in, optional]
由用戶端呼叫 InitializeSecurityContext (Kerberos) 所產生之 SecBufferDesc 結構的指標,其中包含輸入緩衝區描述元。
除了呼叫 InitializeSecurityContext (General) 函式所產生的緩衝區之外,還可以傳入類型為 SECBUFFER_CHANNEL_BINDINGS 的 SecBuffer 結構來指定通道系結資訊。 您可以在用戶端用來驗證的通道內容上呼叫 QueryContextAttributes (Schannel) 函式,以取得通道系結緩衝區的通道系結資訊。
fContextReq (f上下文請求)[in]
指定伺服器建立內容所需屬性的位旗標。 您可以使用位 OR 作業來合併位旗標。 此參數可以是下列其中一或多個值。
| 價值 | 意義 |
|---|---|
| ASC_REQ_CONFIDENTIALITY | 加密和解密訊息。 |
| ASC_REQ_CONNECTION | 安全性內容不會處理格式化訊息。 |
| ASC_REQ_DELEGATE | 允許伺服器模擬用戶端。 適用於 Kerberos。 忽略限制 委派的這個旗標。 |
| ASC_REQ_EXTENDED_ERROR | 發生錯誤時,將會通知遠端合作物件。 |
| ASC_REQ_INTEGRITY | 簽署訊息並驗證簽章。 |
| ASC_REQ_REPLAY_DETECT | 偵測重新執行的封包。 |
| ASC_REQ_SEQUENCE_DETECT | 偵測已依順序接收的訊息。 |
如需可能的屬性旗標及其意義,請參閱 內容需求。 用於此參數的旗標前面會加上ASC_REQ,例如ASC_REQ_DELEGATE。
用戶端可能不支援要求的屬性。 如需詳細資訊,請參閱 pfContextAttr 參數。
TargetDataRep[in]
目標上的數據表示法,例如位元組排序。 這個參數可以是SECURITY_NATIVE_DREP或SECURITY_NETWORK_DREP。
phNewContext[in, out, optional]
CtxtHandle 結構的指標。 在第一次呼叫 AcceptSecurityContext (Kerberos)時,此指標會接收新的內容句柄。 在後續呼叫時,phNewContext 可以和 phContext 參數中指定的句柄相同。
phNewContext 不應該是 NULL。
p輸出[in, out, optional]
SecBufferDesc 結構的指標,其中包含輸出緩衝區描述元。 此緩衝區會傳送至用戶端,以輸入 對 InitializeSecurityContext (Kerberos) 的其他呼叫。 即使函式傳回SEC_E_OK,仍可能會產生輸出緩衝區。 產生的任何緩衝區都必須傳送回用戶端應用程式。
pfContextAttr 的[out]
接收一組位旗標的變數指標,指出已建立內容的屬性。 如需各種屬性的描述,請參閱 內容需求。 用於此參數的旗標前面會加上 ASC_RET,例如ASC_RET_DELEGATE。
在最終函數調用成功傳回之前,請勿檢查安全性相關屬性。 屬性旗標與安全性無關,例如ASC_RET_ALLOCATED_MEMORY旗標,可以在最終傳回之前檢查。
ptsTimeStamp (磅時間戳)[out, optional]
TimeStamp 結構的指標,可接收內容的到期時間。 建議 安全性套件 一律以當地時間傳回此值。
備註
在驗證程序的最後一次呼叫之前,內容到期時間可能不正確,因為交涉後續階段將提供更多資訊。 因此, ptsTimeStamp 必須 NULL 等到最後一次呼叫函式為止。
返回值
此函式會傳回下列其中一個值。
| 傳回碼/值 | 說明 |
|---|---|
SEC_E_INSUFFICIENT_MEMORY0x80090300L |
函式失敗。 記憶體不足,無法完成要求的動作。 |
SEC_E_INTERNAL_ERROR0x80090304L |
函式失敗。 未對應至 SSPI 錯誤碼的錯誤發生。 |
SEC_E_INVALID_HANDLE0x80100003L |
函式失敗。 傳遞至函式的句柄無效。 |
SEC_E_INVALID_TOKEN0x80090308L |
函式失敗。 傳遞至函式的令牌無效。 |
SEC_E_LOGON_DENIED0x8009030CL |
登入失敗。 |
SEC_E_NO_AUTHENTICATING_AUTHORITY0x80090311L |
函式失敗。 無法連絡任何授權單位進行驗證。 這可能是因為下列情況所造成: -驗證方域名不正確。 -網域無法使用。 -信任關係失敗。 |
SEC_E_OK0x00000000L |
此函數已成功。 已接受從用戶端接收的安全性內容。 如果函式產生輸出令牌,則必須將它傳送至客戶端進程。 |
SEC_E_UNSUPPORTED_FUNCTION0x80090302L |
函式失敗。 fContextReq 參數中指定了無效的內容屬性旗標(ASC_REQ_DELEGATE或ASC_REQ_PROMPT_FOR_CREDS]。 使用安全通道 SSP 時,可以傳回此值。 |
SEC_I_COMPLETE_AND_CONTINUE0x00090314L |
此函數已成功。 伺服器必須呼叫 CompleteAuthToken ,並將輸出令牌傳遞至用戶端。 伺服器接著會等候用戶端的傳回令牌,然後對 AcceptSecurityContext (Kerberos) 進行另一個呼叫。 |
SEC_I_COMPLETE_NEEDED0x00090313L |
此函數已成功。 伺服器必須完成從用戶端建置訊息,然後呼叫 CompleteAuthToken 函式。 |
SEC_I_CONTINUE_NEEDED0x00090312L |
此函數已成功。 伺服器必須將輸出令牌傳送至用戶端,並等候傳回的令牌。 傳回的令牌應該在 pInput 中傳遞,以便對 AcceptSecurityContext (Kerberos) 進行另一個呼叫。 |
備註
AcceptSecurityContext (Kerberos) 函式是 InitializeSecurityContext (Kerberos) 函式的伺服器對應專案。
當伺服器從用戶端接收要求時,伺服器會使用 fContextReq 參數來指定會話所需的專案。 以這種方式,伺服器可以指定客戶端必須能夠使用機密或 完整性檢查的會話,而且它可以拒絕不符合該需求的用戶端。 或者,伺服器不需要任何專案,而且用戶端可以在 pfContextAttr 參數中傳回或要求的任何專案。
對於支援多回合驗證的套件,例如相互驗證,呼叫順序如下所示:
- 用戶端會將令牌傳送至伺服器。
- 伺服器第一次呼叫 AcceptSecurityContext (Kerberos), 這會產生回復令牌,然後傳送至用戶端。
- 用戶端會收到令牌,並將它傳遞至 InitializeSecurityContext (Kerberos) 。 如果 InitializeSecurityContext (Kerberos) 傳回SEC_E_OK,則相互驗證已完成,且安全會話可以開始。 如果 InitializeSecurityContext (Kerberos) 傳回錯誤碼,相互驗證交涉就會結束。 否則, InitializeSecurityContext (Kerberos) 傳回的安全性令牌會傳送至用戶端,並重複步驟 2 和 3。
- 請勿在 AcceptSecurityContext (Kerberos) 的並行呼叫中使用 phContext 值。 安全性提供者中的實作不是安全線程。
fContextReq 和 pfContextAttr 參數是代表各種內容屬性的位掩碼。 如需各種屬性的描述,請參閱 內容需求。
備註
pfContextAttr 參數在任何成功傳回時都有效,但只有在最後成功傳回時,才檢查內容安全性層面的相關旗標。 中繼傳回可以設定ISC_RET_ALLOCATED_MEMORY旗標。
呼叫端負責判斷最終內容屬性是否足夠。 例如,如果要求機密性(加密),但無法建立,某些應用程式可能會選擇立即關閉連線。 如果無法建立 安全性內容 ,伺服器必須藉由呼叫 DeleteSecurityContext 函式釋放部分建立的內容。 如需何時呼叫 DeleteSecurityContext 函式的相關信息,請參閱 DeleteSecurityContext。
建立 安全性內容 之後,伺服器應用程式可以使用 QuerySecurityContextToken 函式來擷取客戶端憑證所對應的用戶帳戶句柄。 此外,伺服器可以使用 ImpersonateSecurityContext 函式來模擬使用者。
需求
| 要求 | 價值 |
|---|---|
| 最低支援的用戶端 | Windows XP [僅限傳統型應用程式] |
| 最低支援的伺服器 | Windows Server 2003 [僅限傳統型應用程式] |
| 頁首 | Sspi.h (包括 Security.h) |
| 圖書館 | Secur32.lib |
| DLL | Secur32.dll |