共用方式為


編寫已驗證的 SSPI 伺服器

在用戶端與伺服器程式之間可以進行已驗證的通訊之前,伺服器必須註冊其驗證資訊。 特別是,伺服器必須註冊其主體名稱,並指定它所使用的驗證服務。 如需主體名稱的詳細資訊,請參閱 主體名稱。 如需驗證服務的詳細資訊,請參閱 驗證服務

若要註冊其驗證資訊,伺服器會呼叫 RpcServerRegisterAuthInfo 函式。 將指標傳遞至主體名稱做為第一個參數的值。 將第二個參數設定為常數,指出應用程式將使用的驗證服務。 如需驗證服務的描述,請參閱 Authentication-Service 常數

伺服器也可以傳遞金鑰擷取函式的位址做為第三個參數的值。 請參閱 關鍵獲取功能。 若要針對選取的驗證服務使用預設金鑰擷取函式,請將第三個參數設定為 NULL RpcServerRegisterAuthInfo 函式的最後一個參數是傳遞至密鑰擷取函式的指標數據,如果您提供密鑰擷取函式。 在下列程式碼片段中顯示了對 RpcServerRegisterAuthInfo 的呼叫。

dwStatus = DsMakeSpn(
    "ldap",
    "ServerName.domain.com",
    NULL,
    0,
    NULL,
    &pcSpnLength,
    pszSpn);

rpcStatus = RpcServerRegisterAuthInfo (
    psz,                                   // Server principal name
    RPC_C_AUTHN_GSS_NEGOTIATE,             // Authentication service
    NULL,                                  // Use default key function
    NULL);                                 // No arg for key function

此外,伺服器可能會向 RPC 執行期程式庫提供授權函式。 若要設定授權函式,請呼叫 rpcMgmtSetAuthorizationFn函式

分散式應用程式的伺服器部分可以呼叫函式 RpcBindingInqAuthClientRpcBindingInqAuthClientEx 查詢驗證資訊的系結句柄。

如果您的伺服器向安全性支援提供者註冊,將不會分派具有無效認證的用戶端呼叫。 不過,沒有認證的呼叫仍會被處理。 有三種方式可防止這種情況發生:

重要

使用 RpcServerRegisterIfEx 並搭配安全性回呼函式來註冊介面,是最被強烈推薦的檢查客戶端認證的方法。

 

  • 呼叫 RpcBindingInqAuthClient,以判斷用戶端所使用的安全性層級。 如果客戶端未經驗證,您的程式存根可以返回錯誤。