AcceptSecurityCoNtext (General) 函式

AcceptSecurityCoNtext (General) 函式可讓傳輸應用程式的伺服器元件在伺服器與遠端用戶端之間建立安全性內容。 遠端用戶端會使用 InitializeSecurityCoNtext (General) 函式來開始建立 安全性內容的程式。 伺服器可能需要來自遠端用戶端的一或多個回復權杖,才能完成建立 安全性內容

如需搭配特定 安全性支援提供者 使用此函式的相關資訊, (SSP) ,請參閱下列主題。

主題 描述
AcceptSecurityCoNtext (CredSSP) 允許傳輸應用程式的伺服器元件使用認證安全性支援提供者 (CredSSP) ,在伺服器與遠端用戶端之間建立 安全性內容
AcceptSecurityCoNtext (Digest) 讓傳輸應用程式的伺服器元件能夠建立伺服器與使用 Digest 之遠端用戶端之間的 安全性內容
AcceptSecurityCoNtext (Kerberos) 讓傳輸應用程式的伺服器元件能夠在伺服器與使用 Kerberos 的遠端用戶端之間建立 安全性內容
AcceptSecurityCoNtext (Negotiate) 讓傳輸應用程式的伺服器元件能夠建立伺服器與使用 Negotiate 之遠端用戶端之間的 安全性內容
AcceptSecurityCoNtext (NTLM) 讓傳輸應用程式的伺服器元件能夠建立伺服器與使用 NTLM 之遠端用戶端之間的 安全性內容
AcceptSecurityCoNtext (Schannel) 讓傳輸應用程式的伺服器元件能夠建立伺服器與使用 Schannel 之遠端用戶端之間的 安全性內容

語法

SECURITY_STATUS SEC_Entry AcceptSecurityContext(
  _In_opt_    PCredHandle    phCredential,
  _Inout_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 (General) 函式,並將 SECPKG_CRED_INBOUND 或 SECPKG_CRED_BOTH 旗標設定為擷取此控制碼。

phCoNtext[in, out]

CtxtHandle結構的指標。 在第一次呼叫 AcceptSecurityCoNtext (General) 時,此指標為 NULL 。 在後續呼叫時, phCoNtext 是第一次呼叫在 phNewCoNtext 參數中傳回之部分格式內容的控制碼。

警告

請勿在對 AcceptSecurityCoNtext 的並行呼叫中使用相同的內容控制碼 , (一般) 。 安全性服務提供者中的 API 實作不是安全線程。

pInput[in, optional]

用戶端呼叫 InitializeSecurityCoNtext 所產生 之 SecBufferDesc 結構的指標, (包含輸入緩衝區描述元 的一般)

使用 Schannel SSP 時,第一個緩衝區的類型必須為 SECBUFFER_TOKEN,並且包含從用戶端接收的安全性權杖。 第二個緩衝區的類型應該是 SECBUFFER_EMPTY。

使用 Negotiate、Kerberos 或 NTLM SSP 時,除了呼叫InitializeSecurityCoNtext (General) 函式所產生的緩衝區之外,還可以傳入類型為 SECBUFFER_CHANNEL_BINDINGSSecBuffer結構來指定通道系結資訊。 您可以藉由呼叫用戶端用來驗證之 Schannel 內容上的 QueryCoNtextAttributes (Schannel) 函式,來取得通道系結緩衝區的通道系結資訊。

fCoNtextReq[in]

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

意義
ASC_REQ_ALLOCATE_MEMORY 摘要和通道會為您配置輸出緩衝區。 當您完成使用輸出緩衝區時,請呼叫 FreeCoNtextBuffer 函式來釋放它們。
ASC_REQ_ALLOW_MISSING_BINDINGS 表示 Digest 不需要內部和外部通道的通道系結。 當不知道端點通道系結的支援時,此值會用於回溯相容性。
這個值與 ASC_REQ_PROXY_BINDINGS互斥。
只有摘要 SSP 才支援此值。
Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP: 不支援此值。
ASC_REQ_CONFIDENTIALITY 加密和解密訊息。
摘要 SSP 僅支援 SASL 的這個旗標。
ASC_REQ_CONNECTION 安全性內容不會處理格式化訊息。
ASC_REQ_DELEGATE 允許伺服器模擬用戶端。 適用于 Kerberos。 忽略此旗標以進行 限制委派
ASC_REQ_EXTENDED_ERROR 發生錯誤時,將會通知遠端合作物件。
ASC_REQ_HTTP (0x10000000) 使用適用于 HTTP 的摘要。 請省略此旗標,以使用摘要作為 SASL 機制。
ASC_REQ_INTEGRITY 簽署訊息並驗證簽章。
Schannel 不支援此旗標。
ASC_REQ_MUTUAL_AUTH 用戶端必須提供憑證,才能用於用戶端驗證。
只有 Schannel 才支援此旗標。
ASC_REQ_PROXY_BINDINGS 表示 Digest 需要通道系結。
這個值與 ASC_REQ_ALLOW_MISSING_BINDINGS互斥。
只有摘要 SSP 才支援此值。
Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP: 不支援此值。
ASC_REQ_REPLAY_DETECT 偵測重新執行的封包。
ASC_REQ_SEQUENCE_DETECT 偵測依序接收的訊息。
ASC_REQ_STREAM 支援資料流程導向連線。
只有 Schannel 才支援此旗標。

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

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

TargetDataRep[in]

目標上的資料標記法,例如位元組順序。 此參數可以是SECURITY_NATIVE_DREP或SECURITY_NETWORK_DREP。

此參數不會搭配 Schannel 或摘要 SSP 使用。 當您使用 Schannel 或摘要 SSP 時,請為此參數指定零。

phNewCoNtext[in, out, optional]

CtxtHandle結構的指標。 在第一次呼叫 AcceptSecurityCoNtext (General) 時,這個指標會收到新的內容控制碼。 在後續呼叫時, phNewCoNtext 可以與 phCoNtext 參數中指定的控制碼相同。 phNewCoNtext 不應該是 NULL

pOutput[in, out, optional]

SecBufferDesc結構的指標,其中包含輸出緩衝區描述項。 這個緩衝區會傳送給用戶端,以輸入至 對 InitializeSecurityCoNtext 的其他呼叫, (一般) 。 即使函式傳回SEC_E_OK,也可能產生輸出緩衝區。 產生的任何緩衝區都必須傳回給用戶端應用程式。

使用安全通道時,在輸出時,此緩衝區會收到 安全性內容的權杖。 權杖必須傳送至用戶端。 函式也可以傳回類型為 SECBUFFER_EXTRA 的緩衝區。 此外,呼叫端必須傳入類型 為 SECBUFFER_ALERT的緩衝區。 在輸出中,如果產生警示,此緩衝區會包含該警示的相關資訊,且函式會失敗。

pfCoNtextAttr[out]

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

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

ptsTimeStamp[out, optional]

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

此參數設定為常數最大時間。 摘要 式安全性內容或認證在使用摘要式 SSP 時,沒有到期時間。

使用安全通道 SSP 時,這是選擇性的。 當遠端合作物件提供要用於驗證的憑證時,此參數會收到該憑證的到期時間。 如果未提供任何憑證,則會傳回最大時間值。

注意

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

傳回值

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

傳回碼/值描述
SEC_E_BAD_BINDINGS
0x80090346L
函式失敗。 未滿足通道系結原則。
SEC_E_INCOMPLETE_MESSAGE
0x80090318L
此函數已成功。 輸入緩衝區中的資料不完整。 應用程式必須從用戶端讀取其他資料,並再次呼叫 [AcceptSecurityCoNtext (General) ] (acceptsecuritycoNtext--general.md) 。
使用安全通道 SSP 時,可以傳回此值。 如需此傳回值的詳細資訊,請參閱 [AcceptSecurityCoNtext (安全通道) ] (acceptsecuritycoNtext--schannel.md) 。
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參數中指定的認證控制碼無效。 使用 Digest 或 Schannel SSP 時,可以傳回此值。
SEC_E_OK
0x00000000L
此函數已成功。 [*security coNtext*] (..已接受從用戶端收到的 /secgloss/s-gly.md) 。 如果函式產生輸出權杖,則必須將它傳送至用戶端進程。
SEC_E_SECURITY_QOS_FAILED
0x80090332L
函式失敗。 fCoNtextReq參數中指定了不正確內容屬性旗標。 使用摘要式 SSP 時,可以傳回此值。
SEC_E_UNSUPPORTED_FUNCTION
0x80090302L
函式失敗。 fCoNtextReq參數中指定了無效 (ASC_REQ_DELEGATE或ASC_REQ_PROMPT_FOR_CREDS) 的內容屬性旗標。 使用安全通道 SSP 時,可以傳回此值。
SEC_I_COMPLETE_AND_CONTINUE
0x00090314L
此函數已成功。 伺服器必須呼叫 [CompleteAuthToken] (/windows/win32/api/sspi/nf-sspi-completeauthtoken) ,並將輸出權杖傳遞至用戶端。 伺服器接著會等候來自用戶端的傳回權杖,然後呼叫 [AcceptSecurityCoNtext (General) ] (acceptsecuritycoNtext--general.md) 。
SEC_I_COMPLETE_NEEDED
0x00090313L
此函數已成功。 伺服器必須完成從用戶端建置訊息,然後呼叫 [CompleteAuthToken] (/windows/win32/api/sspi/nf-sspi-completeauthtoken) 函式。
SEC_I_CONTINUE_NEEDED
0x00090312L
此函數已成功。 伺服器必須將輸出權杖傳送至用戶端,並等候傳回的權杖。 傳回的權杖應該在 pInput 中傳遞,以呼叫 [AcceptSecurityCoNtext (General) ] (acceptsecuritycoNtext--general.md) 。
STATUS_LOGON_FAILURE
0xC000006DL
函式失敗。 建立指定的內容之後,會呼叫 [AcceptSecurityCoNtext (General) ] (acceptsecuritycoNtext--general.md) 函式。 使用摘要式 SSP 時,可以傳回此值。

備註

AcceptSecurityCoNtext (General) 函式是InitializeSecurityCoNtext (General) 函式的伺服器對應專案。

當伺服器收到來自用戶端的要求時,伺服器會使用 fCoNtextReq 參數來指定會話所需的內容。 如此一來,伺服器就可以指定用戶端必須能夠使用機密或 完整性檢查的會話,而且可以拒絕不符合該需求的用戶端。 或者,伺服器不需要任何專案,而且任何用戶端都可以在 pfCoNtextAttr 參數中傳回或要求的任何專案。

對於支援多回合驗證的套件,例如相互驗證,呼叫順序如下所示:

  1. 用戶端會將權杖傳輸至伺服器。
  2. 伺服器第一次呼叫 AcceptSecurityCoNtext (General) ,這會產生接著傳送至用戶端的回復權杖。
  3. 用戶端會收到權杖,並將它傳遞給 InitializeSecurityCoNtext (General) 。 如果 InitializeSecurityCoNtext (一般) 傳回SEC_E_OK,則已完成相互驗證,而且可以開始安全會話。 如果 InitializeSecurityCoNtext (一般) 傳回錯誤碼,則相互驗證交涉會結束。 否則,InitializeSecurityCoNtext 所傳回的安全性權杖 會 (一般) 傳送至用戶端,並重複步驟 2 和 3。
  4. 請勿在對AcceptSecurityCoNtext (General) 並行呼叫中使用 phCoNtext值。 安全性提供者中的實作不是安全線程。

fCoNtextReqpfCoNtextAttr參數是代表各種內容屬性的位元遮罩。 如需各種屬性的描述,請參閱 內容需求

注意

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

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

建立 安全性內容 之後,伺服器應用程式可以使用 QuerySecurityCoNtextToken 函式來擷取用戶端憑證所對應的使用者帳戶控制碼。 此外,伺服器可以使用 ImpersonateSecurityCoNtext 函式來模擬使用者。

規格需求

需求
最低支援的用戶端 Windows XP [僅限傳統型應用程式]
最低支援的伺服器 Windows Server 2003 [僅限桌面應用程式]
標頭 Sspi.h (包含 Security.h)
程式庫 Secur32.lib
DLL Secur32.dll

另請參閱

SSPI 函式

DeleteSecurityCoNtext

InitializeSecurityCoNtext (一般)