Scrittura di un server SSPI autenticato
Prima che la comunicazione autenticata possa avvenire tra i programmi client e server, il server deve registrare le informazioni di autenticazione. In particolare, il server deve registrare il nome dell'entità e specificare il servizio di autenticazione usato. Per ulteriori informazioni sui nomi principali, vedere Nomi Principali. Per informazioni dettagliate sui servizi di autenticazione, vedere Authentication Services.
Per registrare le informazioni di autenticazione, i server chiamano la funzione RpcServerRegisterAuthInfo. Passare un puntatore al nome principale come valore del primo parametro. Impostare il secondo parametro su una costante che indica il servizio di autenticazione che verrà usato dall'applicazione. Per una descrizione dei servizi di autenticazione, vedere Authentication-Service costanti.
Il server può anche passare l'indirizzo di una funzione di acquisizione chiave come valore del terzo parametro. Consultare le principali funzioni di acquisizione . Per usare la funzione di acquisizione della chiave predefinita per il servizio di autenticazione selezionato, impostare il terzo parametro su NULL. L'ultimo parametro della funzionerpcServerRegisterAuthInfoè un dato puntatore da passare alla funzione di acquisizione della chiave, se si fornisce una funzione di acquisizione chiave. Una chiamata a RpcServerRegisterAuthInfo viene illustrata nel frammento di codice seguente.
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
Inoltre, il server può fornire la libreria di runtime RPC con una funzione di autorizzazione. Per impostare una funzione di autorizzazione, chiamare la funzione RpcMgmtSetAuthorizationFn.
La parte server di un'applicazione distribuita può chiamare la funzione RpcBindingInqAuthClient o RpcBindingInqAuthClientEx per eseguire query su un handle di associazione per le informazioni di autenticazione.
Se il server viene registrato con un provider di supporto per la sicurezza, le chiamate client con credenziali non valide non verranno inviate. Tuttavia, le chiamate senza credenziali verranno inviate. Esistono tre modi per evitare che ciò accada:
- Registrare l'interfaccia usando RpcServerRegisterIfEx, con una funzione di callback di sicurezza; in questo modo la libreria di runtime RPC rifiuterà automaticamente le chiamate non autenticate a tale interfaccia. La registrazione di una funzione di callback è compatibile con altri metodi di controllo delle credenziali di accesso; la funzione di callback può chiamare le RpcImpersonateClient, RpcGetAuthorizationContextForClient, RpcBindingInqAuthClientEx o altre funzioni. Tuttavia, queste funzioni non possono usare gli argomenti passati alla funzione, perché non sono decomposti a quel punto.
Importante
La registrazione dell'interfaccia usando RpcServerRegisterIfEx con una funzione di callback di sicurezza è il metodo più consigliato per controllare le credenziali client.
- Chiamare RpcBindingInqAuthClient per determinare il livello di sicurezza usato dal client. Lo stub può quindi restituire un errore se il client non è autenticato.