Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Tutte le sessioni client/server RPC richiedono un'associazione tra il client e il server. Per aggiungere sicurezza alle applicazioni client/server, i programmi devono usare un'associazione autenticata. In questa sezione viene descritto il processo di creazione di un'associazione autenticata tra il client e il server.
Per informazioni correlate, vedere le procedure usate con la maggior parte dei pacchetti e protocolli di sicurezza nel Platform Software Development Kit (SDK).
Creazione di handle di associazione lato client
Per creare una sessione autenticata con un programma server, le applicazioni client devono fornire informazioni di autenticazione con il relativo handle di associazione. Per configurare un handle di associazione autenticato, i client richiamano la funzione RpcBindingSetAuthInfo o RpcBindingSetAuthInfoEx. Queste due funzioni sono quasi identiche. L'unica differenza tra di esse è che il client può specificare la qualità del servizio con la funzione RpcBindingSetAuthInfoEx.
Il frammento di codice seguente mostra come potrebbe essere visualizzata una chiamata a RpcBindingSetAuthInfo.
// This code fragment assumes that rpcBinding is a valid binding
// handle between the client and the server. It also assumes that
// pAuthCredentials is a valid pointer to a data structure which
// contains the user's authentication credentials.
dwStatus = DsMakeSpn(
"ldap",
"ServerName.domain.com",
NULL,
0,
NULL,
&pcSpnLength,
pszSpn);
//...
rpcStatus = RpcBindingSetAuthInfo(
rpcBinding, // Valid binding handle
pszSpn, // Principal name
RPC_C_AUTHN_LEVEL_PKT_INTEGRITY, // Authentication level
RPC_C_AUTHN_GSS_NEGOTIATE, // Use Negotiate SSP
NULL, // Authentication credentials <entity type="ndash"/> use current thread credentials
RPC_C_AUTHZ_NAME); // Authorization service
Dopo che il client chiama correttamente le funzioni RpcBindingSetAuthInfo o RpcBindingSetAuthInfoEx, la libreria di runtime RPC autentica automaticamente tutte le chiamate RPC sul binding. Il livello di sicurezza e autenticazione selezionato dal client si applica solo all'handle di associazione. Gli handle di contesto derivati dall'handle di associazione useranno le stesse informazioni di sicurezza, ma le successive modifiche apportate all'handle di associazione non verranno riflesse negli handle di contesto. Per altre informazioni, vedere handle di contesto .
Il livello di autenticazione rimane attivo fino a quando il client non sceglie un altro livello o fino al termine del processo. La maggior parte delle applicazioni non richiederà una modifica del livello di sicurezza. Il client può interrogare qualsiasi handle di associazione per ottenere le informazioni di autorizzazione utilizzando RpcBindingInqAuthClient e passandogli l'handle di associazione.
Specifica delle credenziali client al server
I server usano le informazioni di associazione del client per applicare la sicurezza. Sempre, i client passano un handle vincolante come primo parametro di una chiamata di procedura remota. Tuttavia, i server non possono usare l'handle a meno che non sia dichiarato come primo parametro per le procedure remote nel file IDL o nel file di configurazione dell'applicazione del server. È possibile scegliere di elencare l'handle di associazione nel file IDL, ma in questo modo tutti i client devono dichiarare e modificare l'handle di associazione anziché usare l'associazione automatica o implicita. Per ulteriori informazioni, vedere i file IDL e ACF.
Un altro metodo consiste nell'escludere gli handle di associazione dal file IDL e posizionare l'attributo explicit_handle nell'ACF del server. In questo modo, il client può usare il tipo di associazione più adatto all'applicazione, mentre il server usa l'handle di associazione come se fosse dichiarato in modo esplicito.
Il processo di estrazione delle credenziali client dall'handle di associazione avviene nel modo seguente:
- I client RPC chiamano rpcBindingSetAuthInfo e includono le informazioni di autenticazione come parte delle informazioni di associazione passate al server.
- In genere, il server chiama RpcImpersonateClient per comportarsi come se fosse il client. Se l'handle di associazione non è autenticato, la chiamata ha esito negativo con errore RPC_S_NO_CONTEXT_AVAILABLE. Per ottenere il nome utente del client, chiamare RpcBindingInqAuthClient durante l'impersonificazione o, in Windows XP o nelle versioni successive di Windows, chiamare RpcGetAuthorizationContextForClient per ottenere il contesto di autorizzazione, quindi usare le funzioni Authz per recuperare il nome.
- Il server chiamerà normalmente CreatePrivateObjectSecurity per creare oggetti con ACL. Al termine, i controlli di sicurezza successivi diventano automatici.