Как описано в Разделе 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".