RPC services can use service connection points to publish
themselves, or they can use the RPC name service (RpcNs) APIs. This
topic discusses how to perform mutual authentication with an RPC
service that publishes itself using the RPC name service (RpcNs)
APIs.
To register an
SPN in the directory
Call the DsGetSpn function to
compose a service principal name (SPN) for the service.
Call the DsWriteAccountSpn function to
register the SPN on the service account or computer account in
whose context the service will run.
To register a
service with the RPC naming service
Verify that the appropriate SPNs are registered on the account
under which the service is running. For more information, see
Logon Account
Maintenance Tasks.
Call the RpcServerRegisterAuthInfo function to register
the service SPN with the RPC authentication service, and specify
RPC_C_AUTHN_GSS_NEGOTIATE as the authentication service to
use.
For more information about performing mutual authentication in
an RPC service, see Writing an Authenticated SSPI Server.
To authenticate
the service from the client
Extract the host name from the RPC Binding.
Compose the SPN for the service by calling the DsMakeSpn function with the service
class, the DNS host name, and the service name; that is the
distinguished name of the connection point in the case of RpcNs.
Set up an RPC_SECURITY_QOS structure to request mutual
authentication.
Call the RpcBindingSetAuthInfoEx function to set the
authentication data for the RPC binding. The client must request at
least RPC_C_AUTHN_LEVEL_PKT_INTEGRITY to ensure that communications
have not been tampered. For increased security, the client should
specify RPC_C_AUTHN_LEVEL_PKT_PRIVACY to request encryption.
Perform the RPC call.
For more information about performing mutual authentication in
an RPC client, see Writing an Authenticated SSPI Client.
To authenticate
the client from the service
Call the RpcBindingInqAuthClient function to verify the
authentication parameters specified by the client. If the client
has not requested the desired level of authentication, reject the
call. Be aware that an RPC service must verify the authentication
level, authentication service, and client identity on every call to
ensure that the client has been properly authenticated.
Call the RpcImpersonateClient function to impersonate
the client.
Perform the requested operation.
Call the RpcRevertToSelf function to revert to the
service security context.
For more information about RPC client impersontation, see Client
Impersonation.