Share via


撰寫已驗證的 SSPI 伺服器

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

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

伺服器也可以傳遞金鑰擷取函式的位址做為第三個參數的值。 請參閱 主要擷取函式。 若要針對選取的驗證服務使用預設金鑰擷取函式,請將第三個參數設定為 NullRpcServerRegisterAuthInfo函式的最後一個參數是傳遞至金鑰擷取函式的指標資料,如果您提供金鑰擷取函式。 對 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 以判斷用戶端正在使用的安全性層級。 如果用戶端未經驗證,則存根可以傳回錯誤。