I'm using QuickFIX and C# to create a FIX acceptor (server). I want the client (the FIX initiator) to logon using a username and password. However, I'm not sure how I can do that in QuickFIX.
By debugging into the QuickFIX source code I have discovered the following sequence of events:
Session::verify
to verify the logon.Session::verify
will perform various checks of things like comp ID's and sequence numbers and at some point determine that the logon received is valid.Session::verify
will then call the Application::fromAdmin
callback which I assume is the natural place to customize things like logon.How do I customize the FIX logon process in an acceptor? Is modifying the QuickFIX code my only option?
Если вы используете FIX 4.3 или более позднюю версию, сообщение Вход может содержать тег Пароль. Если вы используете предыдущую версию, сделайте ее настраиваемым тегом и добавьте в словари.
В обработчике fromAdmin
проверьте правильность пароля (из таблицы поиска или откуда-то еще). Если это не так, создайте исключение RejectLogon
. Если это исключение не сгенерировано, QuickFix будет считать, что все в порядке, и зарегистрирует пользователя.
Пример (требуется дополнительная проверка работоспособности):
public void fromAdmin(Message message, SessionID id)
{
var logon = message as QuickFix44.Logon;
if (logon != null)
{
string userName = logon.getUserName().getValue();
string expectedPassword = PasswordsByUser[userName];
string suppliedPassword = logon.getPassword().getValue();
if(expectedPassword != suppliedPassword)
throw new RejectLogon();
}
}
fromAdmin уведомляет вас, когда административное сообщение отправляется от контрагента на ваш механизм FIX. Это может быть полезно для дополнительной проверки сообщений о входе в систему, например для проверки паролей. Создание исключения RejectLogon приведет к отключению контрагента.
Проверка сеанса обычно проверяет начальную строку FIX, SenderCompID и целевой CompID. Если эти 3 в порядке, тогда сессия настроена (QuickFIXJ имеет другие поля также для идентификаторов субкомпьютеров).
Даже после того, как сеанс был настроен, сообщения не будут приниматься получателем для этого конкретного сеанса, пока не будет завершен процесс входа в систему. Вы получите отказ, если попытаетесь это сделать.
Таким образом, в fromAdmin вы можете проверить входящий запрос на вход в систему и проверить действительный пароль, содержащийся в сообщении о входе в систему, который вы ожидаете для этого подключения/сеанса.