認証時のアクセス ポイントと認証プロトコルの相互作用
RasEapMakeMessage 関数は、認証プロトコルとアクセス ポイント (AP) の間の相互作用の大部分を制御します。 RasEapMakeMessage は 、受信 EAP パケットを処理し、リモート ピアへの送信用の EAP パケットを作成します。 また、タイムアウトや認証完了などのイベントも処理します。
リモート ピアからメッセージを受信した場合、AP 認証サービスは RasEapMakeMessage を呼び出し、 pReceivePacket パラメーターで受信したメッセージへのポインターを渡します。
サービスが pReceivePacket を NULL に設定して RasEapMakeMessage を呼び出す場合、AP は認証プロトコルを使用してダイアログを開始するか、プロトコルに最後のパケットの再送信を要求します。 認証プロトコルは、サービスの状態とメッセージ コンテキストに基づいて、どのアクションを実行するかを決定する必要があります。
RasEapMakeMessage から戻ると、PPP_EAP_OUTPUT構造体の Action メンバーの値は、認証サービスが実行するアクション (ある場合) を示します。 Action メンバーは、PPP_EAP_ACTION列挙型から値を受け取ります。
Action がEAPACTION_Send、EAPACTION_SendAndDone、EAPACTION_SendWithTimeout、またはEAPACTION_SendWithTimeoutInteractiveの場合、サービスは pSendPacket パラメーターによって指されるパケットをリモート ピアに送信します。
EAPACTION_SendWithTimeout値を指定すると、タイムアウトが許可され、その後、認証サービスはリンクが失われたと想定し、セッションを切断します。
EAPACTION_SendWithTimeoutInteractive値を指定すると、無限のタイムアウトが発生します。 認証子は、クライアントでユーザー入力が必要な場合にこの値を使用する必要があります。 このタイムアウトにより、ユーザーは必要な入力を完了する時間を指定できません。
Action が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 メンバーを調べます。 dwAuthResultCode がNO_ERROR場合、認証は成功しました。 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
Action がEAPACTION_DoneまたはEAPACTION_SendAndDoneの場合、pUserAttributes メンバーは RasEapBegin の呼び出しでサーバーに渡されたのと同じ型の属性をオーバーライドする属性を指す必要があります。
サーバー上の認証プロトコルは、PPP_EAP_OUTPUTの Action メンバーで EAPACTION_Authenticateを返すことによって、認証サービスが現在の認証プロバイダーを呼び出すように要求できます。 この場合、PPP_EAP_OUTPUTの pUserAttributes ポインターは、サーバー上の認証プロトコルによって生成された属性のみを指します。 RasEapBegin の呼び出しでサーバーに渡された属性は含まれません。 認証資格情報は別の RADIUS 属性ではなく EAP メッセージ自体の内部にあるため、認証プロバイダーではこれらの初期属性は必要ありません。 認証サービスが EAPACTION_Authenticate アクションに応答すると、PPP_EAP_INPUTの pUserAttributes は認証時に生成されたすべての属性を指します。 これらの属性は、クライアントの認証プロトコルに返されます。
認証プロトコルで EAPACTION_Authenticateを使用する場合、認証プロバイダーは PAP または MD5-CHAP を実行します。 この認証方法は、Windows クライアントでのみ使用できます。
認証プロトコルが認証プロバイダーに依存せずにユーザーを認証する場合、プロトコルで アクション を EAPACTION_Authenticate に設定する必要はありません。 この場合の例として、EAP-Transportレイヤー セキュリティ (TLS) があります。
EAP 成功パケットは、受信確認されていないパケットです。 そのため、サーバーによって失われ、再送信されない可能性があります。 クライアント上の認証サービスがネットワーク制御プロトコル (NCP) パケットを受信した場合、サーバー側の認証サービスは認証が成功したかのように続行されます。 これは、サーバーが PPP の NCP フェーズに移行したためです。 したがって、認証サービスは、PPP_EAP_INPUT構造体の fSuccessPacketReceived メンバーを TRUE に設定して RasEapMakeMessage を呼び出します。
認証セッションの実行中に、認証プロトコルでクライアント上のユーザーとの直接の対話が必要になる場合があります。 認証プロトコル ベンダーは、この目的のために対話型ユーザー インターフェイスを提供できます。 認証プロトコルは、PPP_EAP_OUTPUT構造体に fInvokeInteractiveUI、pUIContextData、dwSizeOfUIContextData メンバーを設定することで、サービスに対話型 UI を表示するように要求できます。 対話型 UI の使用の詳細については、「 対話型ユーザー インターフェイス」を参照してください。
認証プロトコルでは、「対話型ユーザー インターフェイス」で説明されているメカニズムを介してのみ ユーザー インターフェイスを表示する必要があります。 認証プロトコル自体にユーザー インターフェイスが表示されている場合、PPP スレッドはユーザー インターフェイスが閉じるまでブロックします。
認証プロセス中に RasEapMakeMessage がNO_ERRORまたはERROR_PPP_INVALID_PACKET以外の値を返す場合、セッションは切断され、エラーが (サーバー上で) ログに記録されるか、ユーザーに表示されます (クライアント上)。