Escrevendo um servidor SSPI autenticado
Antes que a comunicação autenticada possa ocorrer entre os programas cliente e servidor, o servidor deve registrar suas informações de autenticação. Em particular, o servidor deve registrar seu nome principal e especificar o serviço de autenticação que ele usa. Para obter mais informações sobre nomes de entidade de segurança, consulte Nomes de entidade de segurança. Para obter detalhes sobre os serviços de autenticação, consulte Serviços de Autenticação.
Para registrar suas informações de autenticação, os servidores chamam a função RpcServerRegisterAuthInfo . Passe um ponteiro para o nome da entidade de segurança como o valor do primeiro parâmetro. Defina o segundo parâmetro como uma constante que indica o serviço de autenticação que o aplicativo usará. Para obter uma descrição dos serviços de autenticação, consulte Authentication-Service Constants.
O servidor também pode passar o endereço de uma função de aquisição de chave como o valor do terceiro parâmetro. Confira Funções de aquisição de chave. Para usar a função de aquisição de chave padrão para o serviço de autenticação selecionado, defina o terceiro parâmetro como NULL. O último parâmetro para a função RpcServerRegisterAuthInfo é um dado de ponteiro a ser passado para a função de aquisição de chave, se você fornecer uma função de aquisição de chave. Uma chamada para RpcServerRegisterAuthInfo é mostrada no fragmento de código a seguir.
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
Além disso, o servidor pode fornecer à biblioteca de tempo de execução RPC uma função de autorização. Para definir uma função de autorização, chame a função RpcMgmtSetAuthorizationFn .
A parte do servidor de um aplicativo distribuído pode chamar a função RpcBindingInqAuthClient ou RpcBindingInqAuthClientEx para consultar um identificador de associação para obter informações de autenticação.
Se o servidor se registrar com um provedor de suporte de segurança, as chamadas de cliente com credenciais inválidas não serão expedidas. No entanto, chamadas sem credenciais serão enviadas. Há três maneiras de evitar que isso aconteça:
- Registre a interface usando RpcServerRegisterIfEx, com uma função de retorno de chamada de segurança; isso fará com que a biblioteca de tempo de execução RPC rejeite automaticamente chamadas não autenticadas para essa interface. O registro de uma função de retorno de chamada é compatível com outros métodos de verificação de credenciais de acesso; A função de retorno de chamada pode chamar as funções RpcImpersonateClient, RpcGetAuthorizationContextForClient ou RpcBindingInqAuthClientEx ou outras. No entanto, essas funções não podem usar os argumentos passados para a função, pois não são não contestadas nesse ponto.
Importante
Registrar a interface usando RpcServerRegisterIfEx com uma função de retorno de chamada de segurança é o método mais altamente recomendado de verificação de credenciais do cliente.
- Chame RpcBindingInqAuthClient para determinar o nível de segurança que o cliente está usando. O stub poderá retornar um erro se o cliente não estiver autenticado.