Inicialização do modo de usuário
Aplicativos distribuídos (cliente/servidor) usam pacotes de segurança para obter conexões autenticadas e trocar mensagens. O aplicativo chama funções de SSPI (interface do provedor de suporte de segurança) mapeadas para funções implementadas por SSP/APs e funções implementadas pelo SSP/APs no modo de usuário. Esse mapeamento é executado pela DLL do provedor de segurança (Secur32.dll ou Security.dll), que pode ser carregada nos processos de cliente e servidor dinamicamente. A DLL também pode ser vinculada estaticamente usando Secur32.lib. A DLL e a lib são enviadas com o SDK (Software Development Kit) do Microsoft Windows.
Carregar o pacote de segurança no processo do cliente ou do servidor será tratado pelo sistema, se a DLL SSP/AP que contém o pacote de segurança for registrada corretamente.
O servidor inicia o processo de obtenção de uma conexão segura com um cliente monitorando uma porta, aguardando um cliente enviar uma mensagem. O cliente inicia o processo de obtenção de uma conexão segura com o servidor chamando a função SSPI InitializeSecurityContext (Geral). Essa função é mapeada para a função SpInitLsaModeContext do pacote de segurança personalizado. SpInitLsaModeContext retorna um token para o cliente, que o encaminha para o servidor.
Ao receber o token do cliente, o servidor chama a função SSPI AcceptSecurityContext (Geral), que é enviada para a função SpAcceptLsaModeContext do pacote de segurança. Se a função SpAcceptLsaModeContext for bem-sucedida e não for necessário mais processamento para estabelecer o contexto de segurança, a função deverá retornar STATUS_SUCCESS ao chamador. Se o processamento adicional for necessário, a função deverá retornar SEC_I_CONTINUE_NEEDED e retornar um token para o servidor. O servidor encaminha o token para o cliente, que chama InitializeSecurityContext (Geral) novamente.
Esse ciclo de chamada pode ser repetido sempre que necessário até que uma conexão autenticada seja estabelecida ou falhe. Durante esse processo, se a função SpAcceptLsaModeContext ou SpInitLsaModeContext for bem-sucedida e não for necessário mais processamento para estabelecer o contexto de segurança, a função deverá retornar STATUS_SUCCESS ao chamador. Se o processamento adicional for necessário, a função deverá retornar SEC_I_CONTINUE_NEEDED e retornar um token para o chamador, responsável por encaminhá-lo.
O protocolo implementado pelo pacote de segurança determina o número de vezes que esse ciclo é repetido. Por exemplo, em pacotes de segurança que dão suporte à autenticação mútua de três etapas, a sequência de chamadas é a seguinte:
- O cliente obtém um token chamando InitializeSecurityContext (Geral) e o envia para o servidor. O servidor chama AcceptSecurityContext (Geral) pela primeira vez e recebe de volta um token de resposta que ele envia ao cliente.
- O cliente usa o token recebido do servidor em uma segunda chamada para InitializeSecurityContext (Geral) e recebe de volta um token final. O cliente envia esse token para o servidor.
- O servidor recebe o token gerado na etapa 2 que ele usa na chamada final para AcceptSecurityContext (Geral).
Quando as funções SpAcceptLsaModeContext e SpInitLsaModeContext forem bem-sucedidas e não for necessário mais processamento para estabelecer o contexto de segurança, as funções deverão retornar STATUS_SUCCESS ao chamador. Além disso, se o pacote de segurança personalizado der suporte às funções implementadas pelo SSP/APs no modo de usuário, SpAcceptLsaModeContext e SpInitLsaModeContext deverão retornar TRUE por meio do parâmetro MappedContext . O valor MappedContext não é passado de volta para o aplicativo; ele é interceptado pela LSA.
Quando MappedContext é true, o LSA chama a função SpUsermodeInitialize da DLL SSP/AP. Essa função fornece tabelas de ponteiros para as funções de modo de usuário implementadas por cada pacote de segurança. A função SpInstanceInit de cada pacote é chamada, usando as tabelas de função retornadas por SpUsermodeInitialize. O SpInstanceInit recebe uma tabela de ponteiros para funções LSA chamadas por SSP/APs no modo de usuário.