撰寫已驗證的 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 以判斷用戶端正在使用的安全性層級。 如果用戶端未經驗證,則存根可以傳回錯誤。