Interaction du point d’accès et du protocole d’authentification pendant l’authentification
La fonction RasEapMakeMessage contrôle la majorité de l’interaction entre le protocole d’authentification et le point d’accès (AP). RasEapMakeMessage traite les paquets EAP entrants et crée des paquets EAP pour les transmettre à l’homologue distant. Il traite également les événements tels que les délais d’expiration et l’achèvement de l’authentification.
Si un message est reçu de l’homologue distant, le service d’authentification AP appelle RasEapMakeMessage, en passant un pointeur vers le message reçu dans le paramètre pReceivePacket .
Si le service appelle RasEapMakeMessage avec pReceivePacket défini sur NULL, l’AP lance le dialogue avec le protocole d’authentification ou demande au protocole de renvoyer le dernier paquet. Le protocole d’authentification doit déterminer l’action que le service effectue en fonction de son état et du contexte du message.
Au retour de RasEapMakeMessage, la valeur du membre Action de la structure PPP_EAP_OUTPUT indique l’action, le cas échéant, que le service d’authentification effectue. Le membre Action prend les valeurs du type énuméré PPP_EAP_ACTION .
Si Action est EAPACTION_Send, EAPACTION_SendAndDone, EAPACTION_SendWithTimeout ou EAPACTION_SendWithTimeoutInteractive, le service transmet le paquet vers lequel pointe le paramètre pSendPacket à l’homologue distant.
La valeur EAPACTION_SendWithTimeout autorise un délai d’attente, après quoi le service d’authentification suppose que le lien a été perdu et déconnecte la session.
La valeur EAPACTION_SendWithTimeoutInteractive permet un délai d’attente infini. L’authentificateur doit utiliser cette valeur lors de l’attente d’une entrée utilisateur sur le client. Ce délai d’expiration permet à l’utilisateur d’avoir un délai non spécifié pour terminer l’entrée requise.
Si Action est EAPACTION_SendWithTimeout ou EAPACTION_SendWithTimeoutInteractive, le protocole d’authentification doit définir le membre dwIdExpected de la structure PPP_EAP_OUTPUT sur l’identificateur du paquet suivant attendu à partir de l’homologue distant. Que le paquet suivant reçu de l’homologue corresponde ou non à cette valeur, le service d’authentification transmet le paquet au protocole d’authentification dans un appel ultérieur à RasEapMakeMessage. Le protocole d’authentification peut ignorer silencieusement le paquet en retournant simplement ERROR_PPP_INVALID_PACKET. Si un paquet avec l’identificateur attendu n’est pas reçu dans le délai d’attente configuré, le service d’authentification appelle toujours RasEapMakeMessage. Dans ce cas, l’appel est effectué avec le paramètre pReceivePacket défini sur NULL, pour indiquer que le paquet précédent doit être envoyé à nouveau.
Si le membre Action est EAPACTION_Done ou EAPACTION_SendAndDone, le service d’authentification examine le membre dwAuthResultCode de PPP_EAP_OUTPUT. Si dwAuthResultCode est NO_ERROR, l’authentification a réussi. Si dwAuthResultCode est une valeur autre que NO_ERROR, l’authentification a échoué. Le code d’erreur retourné pour le cas d’échec doit provenir de Raserror.h, Mprerror.h ou Winerror.h. Les codes de retour possibles incluent, sans s’y limiter, les suivants :
- ERROR_NO_DIALIN_PERMISSION
- ERROR_PASSWD_EXPIRED
- ERROR_ACCT_DISABLED
- ERROR_RESTRICTED_LOGON_HOURS
- ERROR_AUTH_INTERNAL
Dans le cas où Action est EAPACTION_Done ou EAPACTION_SendAndDone, le membre pUserAttributes doit pointer vers des attributs qui remplacent les attributs du même type qui ont été transmis au serveur dans l’appel à RasEapBegin.
Le protocole d’authentification sur le serveur peut demander au service d’authentification d’appeler le fournisseur d’authentification actuel en retournant EAPACTION_Authenticate dans le membre Action dans PPP_EAP_OUTPUT. Dans ce cas, le pointeur pUserAttributes dans PPP_EAP_OUTPUT pointe uniquement vers les attributs générés par le protocole d’authentification sur le serveur. Il n’inclut aucun des attributs qui ont été passés au serveur dans l’appel à RasEapBegin. Le fournisseur d’authentification n’a pas besoin de ces attributs initiaux, car les informations d’identification d’authentification se trouvent à l’intérieur du message EAP lui-même, et non dans un attribut RADIUS distinct. Lorsque le service d’authentification répond à l’action EAPACTION_Authenticate , pUserAttributes dans PPP_EAP_INPUT, pointe vers tous les attributs générés pendant l’authentification. Ces attributs sont retournés au protocole d’authentification sur le client.
Si le protocole d’authentification utilise EAPACTION_Authenticate, le fournisseur d’authentification effectue pap ou MD5-CHAP. Cette méthode d’authentification ne peut être utilisée qu’avec les clients Windows.
Si le protocole d’authentification authentifie l’utilisateur sans dépendre d’un fournisseur d’authentification, il n’est pas nécessaire que le protocole définisse action sur EAPACTION_Authenticate. Un exemple de ce cas est EAP-Transport Layer Security (TLS).
Le paquet de réussite EAP est un paquet non reconnu. Par conséquent, il peut être perdu et ne pas être renvoyé par le serveur. Si le service d’authentification sur le client reçoit un paquet NCP (Network Control Protocol), le service d’authentification côté serveur se poursuit comme si l’authentification avait réussi. Cela est dû au fait que le serveur est passé à la phase NCP de PPP. Par conséquent, le service d’authentification appelle RasEapMakeMessage avec le membre fSuccesPacketReceived de la structure PPP_EAP_INPUT défini sur TRUE.
Au cours de la session d’authentification, le protocole d’authentification peut nécessiter une interaction directe avec l’utilisateur sur le client. Le fournisseur du protocole d’authentification peut fournir une interface utilisateur interactive à cet effet. Le protocole d’authentification peut demander au service d’afficher l’interface utilisateur interactive en définissant les membres fInvokeInteractiveUI, pUIContextData et dwSizeOfUIContextData dans la structure PPP_EAP_OUTPUT . Pour plus d’informations sur l’utilisation d’une interface utilisateur interactive, consultez Interface utilisateur interactive.
Le protocole d’authentification doit afficher une interface utilisateur uniquement via le mécanisme décrit sous Interface utilisateur interactive. Si le protocole d’authentification lui-même affiche l’interface utilisateur, le thread PPP se bloque jusqu’à ce que l’interface utilisateur soit ignorée.
Si, pendant le processus d’authentification, RasEapMakeMessage retourne une valeur autre que NO_ERROR ou ERROR_PPP_INVALID_PACKET, la session est déconnectée et l’erreur est enregistrée (sur le serveur) ou affichée à l’utilisateur (sur le client).