共用方式為


AcceptSecurityContext (CredSSP) 函式

AcceptSecurityContext (CredSSP) 函式可讓傳輸應用程式的伺服器元件在伺服器與遠端用戶端之間建立安全性內容。 遠端用戶端會呼叫 InitializeSecurityContext (CredSSP) 函式,以開始建立安全性內容的程式。 伺服器可能需要來自遠端用戶端的一或多個回復令牌,才能完成建立安全性內容。

語法

SECURITY_STATUS SEC_ENTRY AcceptSecurityContext(
  _In_opt_    PCredHandle    phCredential,
  _In_opt_    PCtxtHandle    phContext,
  _In_opt_    PSecBufferDesc pInput,
  _In_        unsigned long  fContextReq,
  _In_        unsigned long  TargetDataRep,
  _Inout_opt_ PCtxtHandle    phNewContext,
  _Inout_opt_ PSecBufferDesc pOutput,
  _Out_       unsigned long  *pfContextAttr,
  _Out_opt_   PTimeStamp     ptsExpiry
);

參數

phCredential [in, optional]

伺服器認證的句柄。 若要擷取此句柄,伺服器會呼叫 AcquireCredentialsHandle (CredSSP) 函式,並設定SECPKG_CRED_INBOUND或SECPKG_CRED_BOTH旗標。

phContext [in, optional]

CtxtHandle 結構的指標。 在第一次呼叫 AcceptSecurityContext (CredSSP)時,此指標為 NULL。 在後續呼叫時,phContext 會指定第一次呼叫在 phNewContext 參數中傳回的部分格式內容。

警告

請勿在 AcceptSecurityContext (CredSSP) 的並行呼叫中使用相同的內容句柄。 安全性服務提供者中的 API 實作不是安全線程。

pInput [in, optional]

由用戶端呼叫 InitializeSecurityContext (CredSSP) 所產生的 SecBufferDesc 結構的指標。 結構包含輸入緩衝區描述元。

第一個緩衝區的類型必須是 SECBUFFER_TOKEN ,且包含從用戶端接收的安全性令牌。 第二個緩衝區的類型應該是 SECBUFFER_EMPTY

fContextReq [in]

-位旗標,指定伺服器建立內容所需的屬性。 您可以使用位 OR 作業來合併位旗標。 此參數可以是下列其中一或多個值。

意義
ASC_REQ_ALLOCATE_MEMORY 認證安全性支援提供者 (CredSSP) 將會配置輸出緩衝區。 當您完成使用輸出緩衝區時,請呼叫 FreeContextBuffer函 式來釋放它們。
ASC_REQ_CONNECTION 安全性內容不會處理格式化訊息。
ASC_REQ_DELEGATE 允許伺服器模擬用戶端。 忽略限制委派的這個旗標。
ASC_REQ_EXTENDED_ERROR 發生錯誤時,將會通知遠端合作物件。
ASC_REQ_REPLAY_DETECT 偵測重新執行的封包。
ASC_REQ_SEQUENCE_DETECT 偵測已依順序接收的訊息。
ASC_REQ_STREAM 支持數據流導向連線。

如需可能的屬性旗標及其意義,請參閱 內容需求。 用於此參數的旗標前面會加上ASC_REQ,例如ASC_REQ_DELEGATE。

用戶端可能不支援要求的屬性。 如需詳細資訊,請參閱 pfContextAttr 參數。

TargetDataRep [in]

目標上的數據表示法,例如位元組排序。 此參數可以是 SECURITY_NATIVE_DREPSECURITY_NETWORK_DREP

phNewContext [in, out, optional]

CtxtHandle 結構的指標。 在第一次呼叫 AcceptSecurityContext (CredSSP)時,此指標會收到新的內容句柄。 在後續呼叫時,phNewContext 可以和 phContext 參數中指定的句柄相同。

pOutput [in, out, optional]

SecBufferDesc 結構的指標,其中包含輸出緩衝區描述元。 此緩衝區會傳送至用戶端,以輸入至 InitializeSecurityContext (CredSSP) 的其他呼叫。 即使函式傳回SEC_E_OK,仍可能會產生輸出緩衝區。 產生的任何緩衝區都必須傳送回用戶端應用程式。

在輸出中,此緩衝區會接收安全性內容的令牌。 令牌必須傳送至用戶端。 函式也可以傳回類型為 SECBUFFER_EXTRA的緩衝區。

pfContextAttr [out]

一組位旗標的指標,表示已建立內容的屬性。 如需各種屬性的描述,請參閱 內容需求。 用於此參數的旗標前面會加上 ASC_RET,例如ASC_RET_DELEGATE。

在最終函數調用成功傳回之前,請勿檢查安全性相關屬性。 屬性旗標與安全性無關,例如ASC_RET_ALLOCATED_MEMORY旗標,可以在最終傳回之前檢查。

ptsExpiry [out, optional]

TimeStamp 結構的指標,可接收內容的到期時間。 建議安全性套件一律以當地時間傳回此值。

注意

在驗證程序的最後一次呼叫之前,內容到期時間可能不正確,因為交涉後續階段將提供更多資訊。 因此, ptsTimeStamp 必須 NULL 等到最後一次呼叫函式為止。

傳回值

此函式會傳回下列其中一個值。

傳回碼/值 描述
SEC_E_INCOMPLETE_MESSAGE
0x80090318L
此函數已成功。 輸入緩衝區中的數據不完整。 應用程式必須從用戶端讀取其他數據,並再次呼叫 AcceptSecurityContext (CredSSP)。
SEC_E_INSUFFICIENT_MEMORY
0x80090300L
函式失敗。 記憶體不足,無法完成要求的動作。
SEC_E_INTERNAL_ERROR
0x80090304L
函式失敗。 未對應至 SSPI 錯誤碼的錯誤發生。
SEC_E_INVALID_HANDLE
0x80100003L
函式失敗。 傳遞至函式的句柄無效。
SEC_E_INVALID_TOKEN
0x80090308L
函式失敗。 傳遞至函式的令牌無效。
SEC_E_LOGON_DENIED
0x8009030CL
登入失敗。
SEC_E_NO_AUTHENTICATING_AUTHORITY
0x80090311L
函式失敗。 無法連絡任何授權單位進行驗證。 這可能是因為下列情況所造成:
  • 驗證方域名不正確。
  • 網域無法使用。
  • 信任關係失敗。
SEC_E_NO_CREDENTIALS
0x8009030EL
函式失敗。 phCredential 參數中指定的認證句柄無效。
SEC_E_OK
0x00000000L
此函數已成功。 已接受從用戶端接收的安全性內容。 如果函式產生輸出令牌,則必須將令牌傳送至客戶端進程。
SEC_E_UNSUPPORTED_FUNCTION
0x80090302L
函式失敗。 fContextReq 參數指定了無效的內容屬性旗標(ASC_REQ_DELEGATE或ASC_REQ_PROMPT_FOR_CREDS)。
SEC_I_COMPLETE_AND_CONTINUE
0x00090314L
此函數已成功。 伺服器必須呼叫 CompleteAuthToken ,並將輸出令牌傳遞至用戶端。 然後,伺服器必須等候用戶端傳回令牌,然後再呼叫 AcceptSecurityContext (CredSSP)。
SEC_I_COMPLETE_NEEDED
0x00090313L
此函數已成功。 伺服器必須先完成從用戶端建置訊息,才能呼叫 CompleteAuthToken
SEC_I_CONTINUE_NEEDED
0x00090312L
此函數已成功。 伺服器必須將輸出令牌傳送至用戶端,並等候傳回的令牌。 傳回的令牌應該在 pInput 中傳遞,以便對 AcceptSecurityContext (CredSSP) 進行另一個呼叫

備註

AcceptSecurityContext (CredSSP) 函式是 InitializeSecurityContext (CredSSP) 函式的伺服器對應專案。

當伺服器從用戶端收到要求時,它會使用 fContextReq 參數來指定會話所需的要求。 以這種方式,伺服器可以要求客戶端能夠使用機密或 完整性檢查的會話;它可以拒絕不符合該需求的用戶端。 或者,伺服器不需要任何專案;無論用戶端需要或可以提供什麼,都會在 pfContextAttr 參數中傳回。

fContextReqpfContextAttr 參數是代表各種內容屬性的位掩碼。 如需各種屬性的描述,請參閱 內容需求

注意

雖然 pfContextAttr 參數在任何成功傳回時都有效,但您應該只在最終成功傳回時檢查內容安全性層面的相關旗標。 中繼傳回可以設定ISC_RET_ALLOCATED_MEMORY旗標。

呼叫端負責判斷最終內容屬性是否足夠。 例如,如果要求機密性(加密),但無法建立,某些應用程式可能會選擇立即關閉連線。 如果無法建立安全性內容,伺服器必須藉由呼叫 DeleteSecurityContext 函式釋放部分建立的內容。 如需何時呼叫 DeleteSecurityContext 函式的相關信息,請參閱 DeleteSecurityContext

建立安全性內容之後,伺服器應用程式可以使用 QuerySecurityContextToken 函式來擷取客戶端憑證所對應的用戶帳戶句柄。 此外,伺服器可以使用 ImpersonateSecurityContext 函式來模擬使用者。

需求

需求
最低支援的用戶端 Windows Vista [僅限傳統型應用程式]
最低支援的伺服器 Windows Server 2008 [僅限傳統型應用程式]
頁首 Sspi.h (包括 Security.h)
程式庫 Secur32.lib
DLL Secur32.dll

另請參閱