Interacción del punto de acceso y el protocolo de autenticación durante la autenticación
La función RasEapMakeMessage controla la mayoría de la interacción entre el protocolo de autenticación y el punto de acceso (AP). RasEapMakeMessage procesa los paquetes EAP entrantes y crea paquetes EAP para la transmisión al mismo nivel remoto. También procesa eventos como tiempos de espera y finalización de autenticación.
Si se recibe un mensaje del mismo nivel remoto, el servicio de autenticación de AP llama a RasEapMakeMessage, pasando un puntero al mensaje recibido en el parámetro pReceivePacket .
Si el servicio llama a RasEapMakeMessage con pReceivePacket establecido en NULL, el AP inicia el cuadro de diálogo con el protocolo de autenticación o solicita que el protocolo vuelva a enviar el último paquete. El protocolo de autenticación debe determinar qué acción realiza el servicio en función de su estado y del contexto del mensaje.
Al devolver rasEapMakeMessage, el valor del miembro Action de la estructura de PPP_EAP_OUTPUT indica qué acción, si existe, el servicio de autenticación realiza. El miembro Action toma valores del tipo enumerado PPP_EAP_ACTION .
Si Action es EAPACTION_Send, EAPACTION_SendAndDone, EAPACTION_SendWithTimeout o EAPACTION_SendWithTimeoutInteractive, el servicio transmite el paquete al que apunta el parámetro pSendPacket al mismo nivel remoto.
El valor de EAPACTION_SendWithTimeout permite un tiempo de espera, después del cual el servicio de autenticación supone que se perdió el vínculo y desconecta la sesión.
El valor de EAPACTION_SendWithTimeoutInteractive permite que se agote un tiempo de espera infinito. El autenticador debe usar este valor al esperar la entrada del usuario en el cliente. Este tiempo de espera permite al usuario una cantidad de tiempo no especificada para completar la entrada necesaria.
Si Action es EAPACTION_SendWithTimeout o EAPACTION_SendWithTimeoutInteractive, el protocolo de autenticación debe establecer el miembro dwIdExpected de la estructura PPP_EAP_OUTPUT en el identificador del siguiente paquete que se espera del mismo nivel remoto. Independientemente de si el siguiente paquete recibido del mismo nivel coincide con este valor, el servicio de autenticación pasa el paquete al protocolo de autenticación en una llamada posterior a RasEapMakeMessage. El protocolo de autenticación puede descartar el paquete de forma silenciosa simplemente devolviendo ERROR_PPP_INVALID_PACKET. Si no se recibe un paquete con el identificador esperado dentro del período de tiempo de espera configurado, el servicio de autenticación sigue llamando a RasEapMakeMessage. En este caso, la llamada se realiza con el parámetro pReceivePacket establecido en NULL, para indicar que el paquete anterior debe enviarse de nuevo.
Si el miembro Action es EAPACTION_Done o EAPACTION_SendAndDone, el servicio de autenticación examina el miembro dwAuthResultCode de PPP_EAP_OUTPUT. Si dwAuthResultCode está NO_ERROR, la autenticación se realizó correctamente. Si dwAuthResultCode es un valor distinto de NO_ERROR, se produjo un error en la autenticación. El código de error devuelto para el caso de error debe provenir de Raserror.h, Mprerror.h o Winerror.h. Entre los códigos de retorno posibles se incluyen, entre otros, los siguientes:
- ERROR_NO_DIALIN_PERMISSION
- ERROR_PASSWD_EXPIRED
- ERROR_ACCT_DISABLED
- ERROR_RESTRICTED_LOGON_HOURS
- ERROR_AUTH_INTERNAL
En el caso de que Action se EAPACTION_Done o EAPACTION_SendAndDone, el miembro pUserAttributes debe apuntar a atributos que invalidan los atributos del mismo tipo que se pasaron al servidor en la llamada a RasEapBegin.
El protocolo de autenticación del servidor puede solicitar que el servicio de autenticación invoque al proveedor de autenticación actual devolviendo EAPACTION_Authenticate en el miembro Action de PPP_EAP_OUTPUT. En este caso, el puntero pUserAttributes de PPP_EAP_OUTPUT apunta solo a los atributos generados por el protocolo de autenticación en el servidor. No incluye ninguno de los atributos que se pasaron al servidor en la llamada a RasEapBegin. El proveedor de autenticación no requiere estos atributos iniciales porque las credenciales de autenticación están dentro del propio mensaje EAP, no en un atributo RADIUS independiente. Cuando el servicio de autenticación responde a la acción EAPACTION_Authenticate , pUserAttributes en PPP_EAP_INPUT apunta a todos los atributos generados durante la autenticación. Estos atributos se devuelven al protocolo de autenticación en el cliente.
Si el protocolo de autenticación usa EAPACTION_Authenticate, el proveedor de autenticación realiza PAP o MD5-CHAP. Este método de autenticación solo se puede usar con clientes de Windows.
Si el protocolo de autenticación autentica al usuario sin depender de un proveedor de autenticación, no es necesario que el protocolo establezca Acción en EAPACTION_Authenticate. Un ejemplo de este caso es EAP-Transport Seguridad de la capa (TLS).
El paquete de operación correcta de EAP es un paquete no confirmado. Por lo tanto, el servidor puede perderlo y no resentirlo. Si el servicio de autenticación del cliente recibe un paquete del Protocolo de control de red (NCP), el servicio de autenticación del lado servidor continúa como si la autenticación se realizara correctamente. Esto se debe a que el servidor se ha movido a la fase NCP de PPP. En consecuencia, el servicio de autenticación llama a RasEapMakeMessage con el miembro fSuccessPacketReceived de la estructura de PPP_EAP_INPUT establecida en TRUE.
Durante el transcurso de la sesión de autenticación, el protocolo de autenticación puede requerir la interacción directamente con el usuario en el cliente. El proveedor del protocolo de autenticación puede proporcionar una interfaz de usuario interactiva para este fin. El protocolo de autenticación puede solicitar que el servicio muestre la interfaz de usuario interactiva estableciendo los miembros fInvokeInteractiveUI, pUIContextData y dwSizeOfUIContextData en la estructura PPP_EAP_OUTPUT . Para obtener más información sobre el uso de una interfaz de usuario interactiva, consulte Interfaz de usuario interactiva.
El protocolo de autenticación solo debe mostrar una interfaz de usuario a través del mecanismo descrito en Interfaz de usuario interactiva. Si el propio protocolo de autenticación muestra la interfaz de usuario, el subproceso ppp se bloquea hasta que se descarta la interfaz de usuario.
Si durante el proceso de autenticación, RasEapMakeMessage devuelve cualquier valor distinto de NO_ERROR o ERROR_PPP_INVALID_PACKET, la sesión se desconecta y el error se registra (en el servidor) o se muestra al usuario (en el cliente).