Função InitializeSecurityContext (Kerberos)
A função InitializeSecurityContext (Kerberos) inicia o contexto de segurança de saída do lado do cliente de um identificador de credencial. A função é usada para criar um contexto de segurança entre o aplicativo cliente e um par remoto. InitializeSecurityContext (Kerberos) retorna um token que o cliente deve passar para o par remoto, que o par, por sua vez, envia para a implementação de segurança local por meio da chamada AcceptSecurityContext (Kerberos). O token gerado deve ser considerado opaco por todos os chamadores.
Normalmente, a função InitializeSecurityContext (Kerberos) é chamada em um loop até que um contexto de segurança suficiente seja estabelecido.
Sintaxe
SECURITY_STATUS SEC_Entry InitializeSecurityContext(
_In_opt_ PCredHandle phCredential,
_In_opt_ PCtxtHandle phContext,
_In_ SEC_CHAR *pszTargetName,
_In_ ULONG fContextReq,
_In_ ULONG Reserved1,
_In_ ULONG TargetDataRep,
_In_opt_ PSecBufferDesc pInput,
_In_ ULONG Reserved2,
_Inout_opt_ PCtxtHandle phNewContext,
_Inout_opt_ PSecBufferDesc pOutput,
_Out_ PULONG pfContextAttr,
_Out_opt_ PTimeStamp ptsExpiry
);
Parâmetros
phCredential[in, optional]
Um identificador para as credenciais retornadas por AcquireCredentialsHandle (Kerberos). Esse identificador é usado para criar o contexto de segurança. A função InitializeSecurityContext (Kerberos) requer pelo menos credenciais OUTBOUND.
phContext[in, optional]
Um ponteiro para uma estrutura CtxtHandle . Na primeira chamada para InitializeSecurityContext (Kerberos), esse ponteiro é NULL
. Na segunda chamada, esse parâmetro é um ponteiro para o identificador para o contexto parcialmente formado retornado no parâmetro phNewContext pela primeira chamada.
Aviso
Não use o mesmo identificador de contexto em chamadas simultâneas para InitializeSecurityContext (Kerberos). A implementação da API nos provedores de serviços de segurança não é thread-safe.
pszTargetName[in]
Um ponteiro para uma cadeia de caracteres terminada em nulo que indica o SPN (nome da entidade de serviço) ou o contexto de segurança do servidor de destino.
Use um nome de destino totalmente qualificado porque não há suporte para nomes curtos entre florestas.
fContextReq[in]
Sinalizadores de bit que indicam solicitações para o contexto. Nem todos os pacotes podem dar suporte a todos os requisitos. Os sinalizadores usados para esse parâmetro são prefixados com ISC_REQ_, por exemplo, ISC_REQ_DELEGATE. Esse parâmetro pode ser um ou mais dos sinalizadores de atributos a seguir.
Valor | Significado |
---|---|
ISC_REQ_ALLOCATE_MEMORY | O pacote de segurança aloca buffers de saída para você. Quando terminar de usar os buffers de saída, libere-os chamando a função FreeContextBuffer . |
ISC_REQ_CONFIDENTIALITY | Criptografar mensagens usando a função EncryptMessage . |
ISC_REQ_CONNECTION | O contexto de segurança não manipulará a formatação de mensagens. Esse valor é o padrão. |
ISC_REQ_DELEGATE | O servidor pode usar o contexto para autenticar em outros servidores como o cliente. O sinalizador ISC_REQ_MUTUAL_AUTH deve ser definido para que esse sinalizador funcione. Válido para Kerberos. Ignore esse sinalizador para delegação restrita. |
ISC_REQ_EXTENDED_ERROR | Quando ocorrerem erros, a parte remota será notificada. |
ISC_REQ_INTEGRITY | Assine mensagens e verifique assinaturas usando as funções EncryptMessage e MakeSignature . |
ISC_REQ_MUTUAL_AUTH | A política de autenticação mútua do serviço será atendida. CUIDADO: Isso não significa necessariamente que a autenticação mútua seja executada, apenas que a política de autenticação do serviço seja atendida. Para garantir que a autenticação mútua seja executada, chame a função QueryContextAttributes (Kerberos). |
ISC_REQ_NO_INTEGRITY | Se esse sinalizador estiver definido, o sinalizador ISC_REQ_INTEGRITY será ignorado. |
ISC_REQ_REPLAY_DETECT | Detecte mensagens reproduzidas que foram codificadas usando as funções EncryptMessage ou MakeSignature . |
ISC_REQ_SEQUENCE_DETECT | Detectar mensagens recebidas fora da sequência. |
ISC_REQ_STREAM | Suporte a uma conexão orientada a fluxo. |
ISC_REQ_USE_SESSION_KEY | Uma nova chave de sessão deve ser negociada. |
Os atributos solicitados podem não ter suporte do cliente. Para obter mais informações, consulte o parâmetro pfContextAttr .
Para obter mais descrições dos vários atributos, consulte Requisitos de contexto.
Reservado1[in]
Esse parâmetro é reservado e deve ser definido como zero.
TargetDataRep[in]
A representação de dados, como ordenação de bytes, no destino. Esse parâmetro pode ser SECURITY_NATIVE_DREP ou SECURITY_NETWORK_DREP.
pInput[in, optional]
Um ponteiro para uma estrutura SecBufferDesc que contém ponteiros para os buffers fornecidos como entrada para o pacote. A menos que o contexto do cliente tenha sido iniciado pelo servidor, o valor desse parâmetro deve estar NULL
na primeira chamada para a função. Em chamadas subsequentes para a função ou quando o contexto do cliente foi iniciado pelo servidor, o valor desse parâmetro é um ponteiro para um buffer alocado com memória suficiente para manter o token retornado pelo computador remoto.
Reservado2[in]
Esse parâmetro é reservado e deve ser definido como zero.
phNewContext[in, out, optional]
Um ponteiro para uma estrutura CtxtHandle . Na primeira chamada para InitializeSecurityContext (Kerberos), esse ponteiro recebe o novo identificador de contexto. Na segunda chamada, phNewContext pode ser o mesmo que o identificador especificado no parâmetro phContext .
phNewContext nunca deve ser NULL
.
pOutput[in, out, optional]
Um ponteiro para uma estrutura SecBufferDesc que contém ponteiros para a estrutura SecBuffer que recebe os dados de saída. Se um buffer tiver sido digitado como SEC_READWRITE na entrada, ele estará lá na saída. O sistema alocará um buffer para o token de segurança se solicitado (por meio de ISC_REQ_ALLOCATE_MEMORY) e preencherá o endereço no descritor de buffer para o token de segurança.
pfContextAttr[out]
Um ponteiro para uma variável para receber um conjunto de sinalizadores de bits que indicam os atributos do contexto estabelecido. Para obter uma descrição dos vários atributos, consulte Requisitos de contexto.
Os sinalizadores usados para esse parâmetro são prefixados com ISC_RET, como ISC_RET_DELEGATE. Para obter uma lista de valores válidos, consulte o parâmetro fContextReq .
Não marcar para atributos relacionados à segurança até que a chamada de função final retorne com êxito. Os sinalizadores de atributo que não estão relacionados à segurança, como o sinalizador ASC_RET_ALLOCATED_MEMORY, podem ser verificados antes do retorno final.
Observação
Atributos de contexto específicos podem ser alterados durante a negociação com um par remoto.
ptsExpiry[out, optional]
Um ponteiro para uma estrutura TimeStamp que recebe o tempo de expiração do contexto. Recomendamos que o pacote de segurança sempre retorne esse valor no horário local. Como esse parâmetro é opcional, NULL
deve ser passado para clientes de curta duração.
Retornar valor
Se a função for bem-sucedida, a função retornará um dos seguintes códigos de êxito.
Código de retorno | Descrição |
---|---|
SEC_E_OK | O contexto de segurança foi inicializado com êxito. Não há necessidade de outra chamada InitializeSecurityContext (Kerberos). Se a função retornar um token de saída, ou seja, se o SECBUFFER_TOKEN em pOutput for de comprimento diferente de zero, esse token deverá ser enviado ao servidor. |
SEC_I_COMPLETE_AND_CONTINUE | O cliente deve chamar CompleteAuthToken e, em seguida, passar a saída para o servidor. Em seguida, o cliente aguarda um token retornado e passa-o, em outra chamada, para InitializeSecurityContext (Kerberos). |
SEC_I_COMPLETE_NEEDED | O cliente deve concluir a criação da mensagem e, em seguida, chamar a função CompleteAuthToken . |
SEC_I_CONTINUE_NEEDED | O cliente deve enviar o token de saída para o servidor e aguardar um token de retorno. Em seguida, o token retornado é passado em outra chamada para InitializeSecurityContext (Kerberos). O token de saída pode estar vazio. |
SEC_I_INCOMPLETE_CREDENTIALS | Use com schannel. O servidor solicitou a autenticação do cliente e as credenciais fornecidas não incluem um certificado ou o certificado não foi emitido por uma AC (autoridade de certificação) confiável pelo servidor. Para obter mais informações, consulte Comentários. |
Se a função falhar, a função retornará um dos seguintes códigos de erro.
Código de retorno | Descrição |
---|---|
SEC_E_INSUFFICIENT_MEMORY | Não há memória suficiente disponível para concluir a ação solicitada. |
SEC_E_INTERNAL_ERROR | Ocorreu um erro que não foi mapeado para um código de erro SSPI. |
SEC_E_INVALID_HANDLE | O identificador passado para a função não é válido. |
SEC_E_INVALID_TOKEN | O erro ocorre devido a um token de entrada malformado, como um token corrompido em trânsito, um token de tamanho incorreto ou um token passado para a delegação restrita incorreta. Passar um token para o pacote errado pode acontecer se o cliente e o servidor não negociaram a delegação restrita adequada. |
SEC_E_LOGON_DENIED | Falha no logon. |
SEC_E_NO_AUTHENTICATING_AUTHORITY | Nenhuma autoridade pode ser contatada para autenticação. O nome de domínio da parte autenticadora pode estar errado, o domínio pode estar inacessível ou pode ter havido uma falha na relação de confiança. |
SEC_E_NO_CREDENTIALS | Nenhuma credencial está disponível na delegação restrita. |
SEC_E_TARGET_UNKNOWN | O destino não foi reconhecido. |
SEC_E_UNSUPPORTED_FUNCTION | Um sinalizador de atributo de contexto que não é válido (ISC_REQ_DELEGATE ou ISC_REQ_PROMPT_FOR_CREDS) foi especificado no parâmetro fContextReq . |
SEC_E_WRONG_PRINCIPAL | A entidade de segurança que recebeu a solicitação de autenticação não é a mesma passada para o parâmetro pszTargetName . Isso indica uma falha na autenticação mútua. |
Comentários
O chamador é responsável por determinar se os atributos de contexto finais são suficientes. Se, por exemplo, a confidencialidade foi solicitada, mas não pôde ser estabelecida, alguns aplicativos podem optar por desligar a conexão imediatamente.
Se os atributos do contexto de segurança não forem suficientes, o cliente deverá liberar o contexto parcialmente criado chamando a função DeleteSecurityContext .
A função InitializeSecurityContext (Kerberos) é usada por um cliente para inicializar um contexto de saída.
Para um contexto de segurança de duas etapas, a sequência de chamadas é a seguinte:
- O cliente chama a função com phContext definido como
NULL
e preenche o descritor de buffer com a mensagem de entrada. - O pacote de segurança examina os parâmetros e constrói um token opaco, colocando-o no elemento TOKEN na matriz de buffers. Se o parâmetro fContextReq incluir o sinalizador ISC_REQ_ALLOCATE_MEMORY, o pacote de segurança alocará a memória e retornará o ponteiro no elemento TOKEN.
- O cliente envia o token retornado no buffer pOutput para o servidor de destino. Em seguida, o servidor passa o token como um argumento de entrada em uma chamada para a função AcceptSecurityContext (Kerberos).
- AcceptSecurityContext (Kerberos) pode retornar um token, que o servidor envia ao cliente para uma segunda chamada para InitializeSecurityContext (Kerberos) se a primeira chamada retornada SEC_I_CONTINUE_NEEDED.
Para contextos de segurançade várias etapas, como autenticação mútua, a sequência de chamadas é a seguinte:
- O cliente chama a função conforme descrito anteriormente, mas o pacote retorna a SEC_I_CONTINUE_NEEDED código de êxito.
- O cliente envia o token de saída para o servidor e aguarda a resposta do servidor.
- Após o recebimento da resposta do servidor, o cliente chama InitializeSecurityContext (Kerberos) novamente, com phContext definido como o identificador que foi retornado da última chamada. O token recebido do servidor é fornecido no parâmetro pInput .
- Não use o valor phContext em chamadas simultâneas para InitializeSecurityContext (Kerberos). A implementação nos provedores de segurança não é thread-safe.
Se o servidor tiver respondido com êxito, o pacote de segurança retornará SEC_E_OK e uma sessão segura será estabelecida.
Se a função retornar uma das respostas de erro, a resposta do servidor não será aceita e a sessão não será estabelecida.
Se a função retornar SEC_I_CONTINUE_NEEDED, SEC_I_COMPLETE_NEEDED ou SEC_I_COMPLETE_AND_CONTINUE, as etapas 2 e 3 serão repetidas.
Para inicializar um contexto de segurança, mais de uma chamada para essa função pode ser necessária, dependendo do mecanismo de autenticação subjacente, bem como das opções especificadas no parâmetro fContextReq .
Os parâmetros fContextReq e pfContextAttributes são bitmasks que representam vários atributos de contexto. Para obter uma descrição dos vários atributos, consulte Requisitos de contexto. O parâmetro pfContextAttributes é válido em qualquer retorno bem-sucedido, mas somente no retorno final bem-sucedido deve examinar os sinalizadores que pertencem aos aspectos de segurança do contexto. Os retornos intermediários podem definir, por exemplo, o sinalizador ISC_RET_ALLOCATED_MEMORY.
Se o sinalizador ISC_REQ_USE_SUPPLIED_CREDS estiver definido, o pacote de segurança deverá procurar um tipo de buffer SECBUFFER_PKG_PARAMS no buffer de entrada pInput . Essa não é uma solução genérica, mas permite um forte emparelhamento de pacote de segurança e aplicativo quando apropriado.
Se ISC_REQ_ALLOCATE_MEMORY tiver sido especificado, o chamador deverá liberar a memória chamando a função FreeContextBuffer .
Por exemplo, o token de entrada pode ser o desafio de um Gerenciador de LAN. Nesse caso, o token de saída seria a resposta criptografada por NTLM para o desafio.
A ação que o cliente executa depende do código de retorno dessa função. Se o código de retorno for SEC_E_OK, não haverá nenhuma segunda chamada InitializeSecurityContext (Kerberos) e nenhuma resposta do servidor será esperada. Se o código de retorno for SEC_I_CONTINUE_NEEDED, o cliente espera um token em resposta do servidor e o passa em uma segunda chamada para InitializeSecurityContext (Kerberos). O código de retorno SEC_I_COMPLETE_NEEDED indica que o cliente deve concluir a criação da mensagem e chamar a função CompleteAuthToken . O código SEC_I_COMPLETE_AND_CONTINUE incorpora essas duas ações.
Se InitializeSecurityContext (Kerberos) retornar êxito na primeira (ou única) chamada, o chamador deverá eventualmente chamar a função DeleteSecurityContext no identificador retornado, mesmo que a chamada falhe em uma etapa posterior da troca de autenticação.
O cliente pode chamar InitializeSecurityContext (Kerberos) novamente depois de ter sido concluído com êxito. Isso indica ao pacote de segurança que uma reautenticação é desejada.
Os chamadores do modo kernel têm as seguintes diferenças: o nome de destino é uma cadeia de caracteres Unicode que deve ser alocada na memória virtual usando VirtualAlloc; ele não deve ser alocado do pool. Os buffers passados e fornecidos em pInput e pOutput devem estar na memória virtual, não no pool.
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Windows XP [somente aplicativos da área de trabalho] |
Servidor mínimo com suporte | Windows Server 2003 [somente aplicativos da área de trabalho] |
Cabeçalho | Sspi.h (incluir Security.h) |
Biblioteca | Secur32.lib |
DLL | Secur32.dll |
Confira também
AcceptSecurityContext (Kerberos)