身份验证期间的接入点和身份验证协议交互
RasEapMakeMessage 函数控制身份验证协议与接入点之间的大部分交互, (AP) 。 RasEapMakeMessage 处理传入的 EAP 数据包,并创建 EAP 数据包以传输到远程对等方。 它还处理超时和身份验证完成等事件。
如果从远程对等方收到消息,则 AP 身份验证服务会调用 RasEapMakeMessage,并在 pReceivePacket 参数中传递指向收到的消息的指针。
如果服务调用将 pReceivePacket 设置为 NULL 的 RasEapMakeMessage,则 AP 将使用身份验证协议启动对话,或者请求协议重新发送最后一个数据包。 身份验证协议应根据服务的状态和消息上下文确定正在执行的操作。
从 RasEapMakeMessage 返回时,PPP_EAP_OUTPUT 结构的 Action 成员的值指示身份验证服务采取的操作(如果有)。 Action 成员从PPP_EAP_ACTION枚举类型中获取值。
如果操作EAPACTION_Send、EAPACTION_SendAndDone、EAPACTION_SendWithTimeout或EAPACTION_SendWithTimeoutInteractive,则服务会将 pSendPacket 参数指向的数据包传输到远程对等方。
EAPACTION_SendWithTimeout值允许超时,之后身份验证服务会假定链接丢失,并断开会话连接。
EAPACTION_SendWithTimeoutInteractive值允许无限超时。 在客户端上需要用户输入时,验证器应使用此值。 此超时允许用户在未指定的时间内完成所需的输入。
如果操作EAPACTION_SendWithTimeout或EAPACTION_SendWithTimeoutInteractive,则身份验证协议应将PPP_EAP_OUTPUT结构的 dwIdExpected 成员设置为预期来自远程对等方的下一个数据包的标识符。 无论从对等方收到的下一个数据包是否与此值匹配,身份验证服务都会在后续调用 RasEapMakeMessage 时将数据包传递到身份验证协议。 身份验证协议只需返回 ERROR_PPP_INVALID_PACKET即可以无提示方式放弃数据包。 如果在配置的超时期限内未收到具有预期标识符的数据包,则身份验证服务仍调用 RasEapMakeMessage。 在这种情况下,调用时将 pReceivePacket 参数设置为 NULL,以指示需要再次发送以前的数据包。
如果 Action 成员EAPACTION_Done或EAPACTION_SendAndDone,身份验证服务将检查PPP_EAP_OUTPUT的 dwAuthResultCode 成员。 如果 NO_ERROR dwAuthResultCode ,则身份验证成功。 如果 dwAuthResultCode 是除 NO_ERROR 以外的值,则身份验证失败。 为失败案例返回的错误代码应来自 Raserror.h、Mprerror.h 或 Winerror.h。 可能的返回代码包括但不限于以下内容:
- ERROR_NO_DIALIN_PERMISSION
- ERROR_PASSWD_EXPIRED
- ERROR_ACCT_DISABLED
- ERROR_RESTRICTED_LOGON_HOURS
- ERROR_AUTH_INTERNAL
如果操作EAPACTION_Done或EAPACTION_SendAndDone,pUserAttributes 成员应指向替代在调用 RasEapBegin 时传递给服务器的相同类型的属性的属性。
服务器上的身份验证协议可以通过在 PPP_EAP_OUTPUT 中的 Action 成员中返回EAPACTION_Authenticate来请求身份验证服务调用当前身份验证提供程序。 在这种情况下,PPP_EAP_OUTPUT中的 pUserAttributes 指针仅指向服务器上身份验证协议生成的属性。 它不包括在对 RasEapBegin 的调用中传递给服务器的任何属性。 身份验证提供程序不需要这些初始属性,因为身份验证凭据位于 EAP 消息本身内部,而不是在单独的 RADIUS 属性中。 当身份验证服务响应EAPACTION_Authenticate操作时,PPP_EAP_INPUT中的 pUserAttribut 会指向身份验证期间生成的所有属性。 这些属性将返回到客户端上的身份验证协议。
如果身份验证协议使用 EAPACTION_Authenticate,则身份验证提供程序将执行 PAP 或 MD5-CHAP。 此身份验证方法只能与 Windows 客户端一起使用。
如果身份验证协议对用户进行身份验证而不依赖于身份验证提供程序,则协议无需将 “操作” 设置为 “EAPACTION_Authenticate”。 这种情况的一个示例是EAP-Transport层安全性 (TLS) 。
EAP 成功数据包是一个未确认的数据包。 因此,服务器可能会丢失且不会反悔。 如果客户端上的身份验证服务收到网络控制协议 (NCP) 数据包,则服务器端身份验证服务会像身份验证成功一样继续。 这是因为服务器已进入 PPP 的 NCP 阶段。 因此,身份验证服务调用 RasEapMakeMessage,PPP_EAP_INPUT 结构的fSuccessPacketReceived 成员设置为 TRUE。
在身份验证会话过程中,身份验证协议可能需要直接与客户端上的用户交互。 身份验证协议供应商可以提供用于此目的的交互式用户界面。 身份验证协议可以通过在 PPP_EAP_OUTPUT 结构中设置 fInvokeInteractiveUI、 pUIContextData 和 dwSizeOfUIContextData 成员来请求服务显示交互式 UI 。 有关使用交互式 UI 的详细信息,请参阅 交互式用户界面。
身份验证协议应仅通过交互式用户界面下所述的机制显示 用户界面。 如果身份验证协议本身显示用户界面,PPP 线程会阻止,直到消除用户界面。
如果在身份验证过程中, RasEapMakeMessage 返回 除 NO_ERROR 或 ERROR_PPP_INVALID_PACKET 以外的任何值,则会话将断开连接, (服务器) 记录错误,或在客户端) 上向用户显示 (。