Scrittura di un server SSPI autenticato
Prima di poter eseguire la comunicazione autenticata 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 altre informazioni sui nomi delle entità, vedere Nomi entità. Per informazioni dettagliate sui servizi di autenticazione, vedere Servizi di autenticazione.
Per registrare le informazioni di autenticazione, i server chiamano la funzione RpcServerRegisterAuthInfo . Passare un puntatore al nome dell'entità come valore del primo parametro. Impostare il secondo parametro su una costante che indica il servizio di autenticazione usato dall'applicazione. Per una descrizione dei servizi di autenticazione, vedere Costanti del servizio di autenticazione.
Il server può anche passare l'indirizzo di una funzione di acquisizione chiave come valore del terzo parametro. Vedere Funzioni di acquisizione delle chiavi. Per usare la funzione di acquisizione delle chiavi predefinita per il servizio di autenticazione selezionato, impostare il terzo parametro su NULL. L'ultimo parametro della funzione RpcServerRegisterAuthInfo è un data puntatore da passare alla funzione di acquisizione delle chiavi, se si fornisce una funzione di acquisizione chiave. Viene visualizzata una chiamata a RpcServerRegisterAuthInfo 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 si registra 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 rifiuta 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 funzioni RpcImpersonateClient, RpcGetAuthorizationContextForClient o RpcBindingInqAuthClientEx o altri. Tuttavia, queste funzioni non possono usare gli argomenti passati alla funzione, poiché non sono nonmarshalled a quel punto.
Importante
La registrazione dell'interfaccia tramite RpcServerRegisterIfEx con una funzione di callback di sicurezza è il metodo più pesantemente 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.