Partilhar via


Interação de ponto de acesso e protocolo de autenticação durante a autenticação

A função RasEapMakeMessage controla a maior parte da interação entre o protocolo de autenticação e o Ponto de Acesso (AP). RasEapMakeMessage processa pacotes EAP de entrada e cria pacotes EAP para transmissão para o par remoto. Ele também processa eventos como tempos limite e conclusão de autenticação.

Se uma mensagem for recebida do par remoto, o serviço de autenticação AP chamará RasEapMakeMessage, passando um ponteiro para a mensagem recebida no parâmetro pReceivePacket .

Se o serviço chamar RasEapMakeMessage com pReceivePacket definido como NULL, o AP iniciará a caixa de diálogo com o protocolo de autenticação ou solicitará que o protocolo reenvia o último pacote. O protocolo de autenticação deve determinar qual ação o serviço está tomando com base em seu estado e no contexto da mensagem.

No retorno de RasEapMakeMessage, o valor do membro Action da estrutura PPP_EAP_OUTPUT indica qual ação, se houver, o serviço de autenticação executa. O membro Action usa valores do tipo enumerado PPP_EAP_ACTION .

Se Action for EAPACTION_Send, EAPACTION_SendAndDone, EAPACTION_SendWithTimeout ou EAPACTION_SendWithTimeoutInteractive, o serviço transmitirá o pacote apontado pelo parâmetro pSendPacket para o par remoto.

O valor EAPACTION_SendWithTimeout permite um tempo limite, após o qual o serviço de autenticação pressupõe que o link foi perdido e desconecta a sessão.

O valor EAPACTION_SendWithTimeoutInteractive permite que ocorra um tempo limite infinito. O autenticador deve usar esse valor ao esperar a entrada do usuário no cliente. Esse tempo limite permite ao usuário um tempo não especificado para concluir a entrada necessária.

Se Action for EAPACTION_SendWithTimeout ou EAPACTION_SendWithTimeoutInteractive, o protocolo de autenticação deverá definir o membro dwIdExpected da estrutura PPP_EAP_OUTPUT para o identificador do próximo pacote esperado do par remoto. Independentemente de o próximo pacote recebido do par corresponder a esse valor, o serviço de autenticação passa o pacote para o protocolo de autenticação em uma chamada subsequente para RasEapMakeMessage. O protocolo de autenticação pode descartar silenciosamente o pacote simplesmente retornando ERROR_PPP_INVALID_PACKET. Se um pacote com o identificador esperado não for recebido dentro do período de tempo limite configurado, o serviço de autenticação ainda chamará RasEapMakeMessage. Nesse caso, a chamada é feita com o parâmetro pReceivePacket definido como NULL, para indicar que o pacote anterior precisa ser enviado novamente.

Se o membro Action for EAPACTION_Done ou EAPACTION_SendAndDone, o serviço de autenticação examinará o membro dwAuthResultCode do PPP_EAP_OUTPUT. Se dwAuthResultCode for NO_ERROR, a autenticação terá êxito. Se dwAuthResultCode for um valor diferente de NO_ERROR, a autenticação falhará. O código de erro retornado para o caso de falha deve vir de Raserror.h, Mprerror.h ou Winerror.h. Os códigos de retorno possíveis incluem, mas não se limitam a:

  • ERROR_NO_DIALIN_PERMISSION
  • ERROR_PASSWD_EXPIRED
  • ERROR_ACCT_DISABLED
  • ERROR_RESTRICTED_LOGON_HOURS
  • ERROR_AUTH_INTERNAL

No caso em que Action é EAPACTION_Done ou EAPACTION_SendAndDone, o membro pUserAttributes deve apontar para atributos que substituem atributos do mesmo tipo que foram passados para o servidor na chamada para RasEapBegin.

O protocolo de autenticação no servidor pode solicitar que o serviço de autenticação invoque o provedor de autenticação atual retornando EAPACTION_Authenticate no membro Action no PPP_EAP_OUTPUT. Nesse caso, o ponteiro pUserAttributes no PPP_EAP_OUTPUT aponta apenas para atributos que foram gerados pelo protocolo de autenticação no servidor. Ele não inclui nenhum dos atributos que foram passados para o servidor na chamada para RasEapBegin. O provedor de autenticação não requer esses atributos iniciais porque as credenciais de autenticação estão dentro da própria mensagem EAP, não em um atributo RADIUS separado. Quando o serviço de autenticação responde à ação EAPACTION_Authenticate , pUserAttributes em PPP_EAP_INPUT, aponta para todos os atributos gerados durante a autenticação. Esses atributos são retornados ao protocolo de autenticação no cliente.

Se o protocolo de autenticação usar EAPACTION_Authenticate, o provedor de autenticação executará PAP ou MD5-CHAP. Esse método de autenticação só pode ser usado com clientes windows.

Se o protocolo de autenticação autenticar o usuário sem depender de um provedor de autenticação, não será necessário que o protocolo defina Ação como EAPACTION_Authenticate. Um exemplo desse caso é EAP-Transport TLS (Layer Security).

O pacote de êxito do EAP é um pacote não confirmado. Portanto, ele pode ser perdido e não ser reenviado pelo servidor. Se o serviço de autenticação no cliente receber um pacote NCP (Protocolo de Controle de Rede), o serviço de autenticação do lado do servidor continuará como se a autenticação tivesse sido bem-sucedida. Isso ocorre porque o servidor passou para a fase NCP do PPP. Assim, o serviço de autenticação chama RasEapMakeMessage com o membro fSuccessPacketReceived da estrutura PPP_EAP_INPUT definida como TRUE.

Durante a sessão de autenticação, o protocolo de autenticação pode exigir interação diretamente com o usuário no cliente. O fornecedor do protocolo de autenticação pode fornecer uma interface do usuário interativa para essa finalidade. O protocolo de autenticação pode solicitar que o serviço exiba a interface do usuário interativa definindo os membros fInvokeInteractiveUI, pUIContextData e dwSizeOfUIContextData na estrutura PPP_EAP_OUTPUT . Para obter mais informações sobre como usar uma interface do usuário interativa, consulte Interface interativa do usuário.

O protocolo de autenticação deve exibir uma interface do usuário somente por meio do mecanismo descrito em Interface interativa do usuário. Se o próprio protocolo de autenticação exibir a interface do usuário, o thread PPP será bloqueado até que a interface do usuário seja ignorada.

Se durante o processo de autenticação, RasEapMakeMessage retornar qualquer valor diferente de NO_ERROR ou ERROR_PPP_INVALID_PACKET, a sessão será desconectada e o erro será registrado (no servidor) ou exibido para o usuário (no cliente).