Condividi tramite


Scrittura di un client SSPI autenticato

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. Questa sezione descrive il processo di creazione di un'associazione autenticata tra il client e il server.

Per informazioni correlate, vedere Procedure usate con la maggior parte dei pacchetti e dei protocolli di sicurezza in 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 illustra 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 nell'associazione. Il livello di sicurezza e autenticazione selezionato dal client si applica solo a tale handle di associazione. Gli handle di contesto derivati dall'handle di associazione useranno le stesse informazioni di sicurezza, ma le modifiche successive all'handle di associazione non verranno riflesse negli handle di contesto. Per altre informazioni, vedere Handle di contesto.

Il livello di autenticazione rimane effettivo fino a quando il client 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ò eseguire query su qualsiasi handle di associazione per ottenere le informazioni di autorizzazione richiamando RpcBindingInqAuthClient e passandolo all'handle di associazione.

Fornire credenziali client al server

I server usano le informazioni di associazione del client per applicare la sicurezza. I client passano sempre un handle di associazione come primo parametro di una chiamata di routine remota. Tuttavia, i server non possono usare l'handle a meno che non venga dichiarato come primo parametro per le procedure remote nel file IDL o nel file di configurazione dell'applicazione del server ( ACF). È possibile scegliere di elencare l'handle di associazione nel file IDL, ma questo impone a tutti i client di dichiarare e modificare l'handle di associazione anziché usare l'associazione automatica o implicita. Per altre informazioni, vedere IDL e File ACF.

Un altro metodo consiste nel lasciare i handle di associazione fuori 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 stato dichiarato in modo esplicito.

Il processo di estrazione delle credenziali client dall'handle di associazione si verifica come segue:

  • 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 RPC_S_NO_CONTEXT_AVAILABLE. Per ottenere il nome utente del client, chiamare RpcBindingInqAuthClient durante la rappresentazione o in Windows XP o versioni successive di Windows, chiamare RpcGetAuthorizationContextForClient per ottenere il contesto di autorizzazione, quindi usare le funzioni Authz per recuperare il nome.
  • Il server chiama normalmente CreatePrivateObjectSecurity per creare oggetti con elenchi di controllo di accesso. Al termine di questa operazione, i controlli di sicurezza successivi diventano automatici.