Как описано в Разделе 7.4.4, “RDP authentication” , VirtualBox поддерживает произвольные внешние модули для выполнения аутентификации для VRDP сервера. Когда метод аутентификации устанавливается как "external" для указанной ВМ, VirtualBox использует библиотеку которая была указана в команде VBoxManage setproperty vrdpauthlibrary . Эта библиотека загружается процессом ВМ по требованию, т.е. ее загрузка происходит при первом соединении RDP внешнего клиента.
Внешняя аутентификация является более расширяемым, т.к. внешний обработчик может предоставить оба метода доступа: всем(наподобие "null" аутентификации) и делегировать запрос аутентификации гостевой системе. Когда запрос аутентификации передается гостевой компоненте, то существует возможность отменить результат гостевой аутентификации.
В библиотеке VRDP аутентификации требует реализации только одной точки (функции) входа:
#include "VRDPAuth.h"
/**
* Authentication library entry point. Decides whether to allow
* a client connection.
*
* Parameters:
*
* pUuid Pointer to the UUID of the virtual machine
* which the client connected to.
* guestJudgement Result of the guest authentication.
* szUser User name passed in by the client (UTF8).
* szPassword Password passed in by the client (UTF8).
* szDomain Domain passed in by the client (UTF8).
*
* Return code:
*
* VRDPAuthAccessDenied Client access has been denied.
* VRDPAuthAccessGranted Client has the right to use the
* virtual machine.
* VRDPAuthDelegateToGuest Guest operating system must
* authenticate the client and the
* library must be called again with
* the result of the guest
* authentication.
*/
VRDPAuthResult VRDPAUTHCALL VRDPAuth(
PVRDPAUTHUUID pUuid,
VRDPAuthGuestJudgement guestJudgement,
const char *szUser,
const char *szPassword
const char *szDomain)
{
/* process request against your authentication source of choice */
return VRDPAuthAccessGranted;
}
Примечания на счет первого аргумента UUID : VirtualBox использует для хранения UUID в формате двоичных данных для всех платформ. По этой причине целочисленные значения из которых состоит UUID сохраняются в виде прямого порядка байт. Если вам необходимо передать такой UUID в коде программы, в формате которого целочисленные поля хранятся в обратном порядке следования байт (often also called network byte order), то вам необходимо изменить этот порядок, чтобы получить нужное его строковое представление. Для этого требуется:
поменять порядок следования байт 0, 1, 2 и 3
изменить порядок байт 4 и 5
изменить порядок байты 6 и 7.
Использование этого преобразования позволит вам получить нужный результат при конвертировании бинарного представления UUID в строковое представление.
Второй аргумент содержит информацию о состоянии гостевой аутентификации. При первом вызове его всегда необходимо установить в значение VRDPAuthGuestNotAsked . В случае если функция вернет значение VRDPAuthDelegateToGuest будет предпринята попытка гостевой аутентификации и последующий вызов вернет ее результат. Результат принимает значение granted (разрешено)/ denied (запрещено) или no judgement (неопределенно) (компонент гостевой аутентификации по какой то причине не смог принять решение). В случае если есть проблемы с модулем гостевой аутентификацией (например дополнения не установлены или гостевая система не отвечает), будет возвращено значение "not reacted".