編寫已驗證的 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函式。
分散式應用程式的伺服器部分可以呼叫函式 RpcBindingInqAuthClient 或 RpcBindingInqAuthClientEx 查詢驗證資訊的系結句柄。
如果您的伺服器向安全性支援提供者註冊,將不會分派具有無效認證的用戶端呼叫。 不過,沒有認證的呼叫仍會被處理。 有三種方式可防止這種情況發生:
- 使用 RpcServerRegisterIfEx註冊介面,並搭配安全性回呼函式,這會導致 RPC 運行時庫自動拒絕該介面未經驗證的呼叫。 註冊回呼函式與檢查存取認證的其他方法相容;回呼函式本身可以呼叫 RpcImpersonateClient、RpcGetAuthorizationContextForClient或 RpcBindingInqAuthClientEx 函式或其他函式。 不過,這些函式無法使用傳遞至函式的參數,因為這些參數不會在該時間點被反序列化。
重要
使用 RpcServerRegisterIfEx 並搭配安全性回呼函式來註冊介面,是最被強烈推薦的檢查客戶端認證的方法。
- 呼叫 RpcBindingInqAuthClient,以判斷用戶端所使用的安全性層級。 如果客戶端未經驗證,您的程式存根可以返回錯誤。