Настройка процесса входа в FIX в акцепторе QuickFIX - PullRequest
7 голосов
/ 27 августа 2010

Я использую QuickFIX и C # для создания акцептора FIX (сервера). Я хочу, чтобы клиент (инициатор FIX) вошел в систему, используя имя пользователя и пароль. Однако я не уверен, как мне это сделать в QuickFIX.

Отладив исходный код QuickFIX, я обнаружил следующую последовательность событий:

  • QuickFIX вызовет Session::verify для проверки входа в систему.
  • Session::verify выполнит различные проверки таких вещей, как идентификаторы и порядковые номера компьютера, и в какой-то момент определит, что полученный вход в систему действителен.
  • Session::verify затем вызовет обратный вызов Application::fromAdmin, который, как я полагаю, является естественным местом для настройки таких вещей, как вход в систему.
  • Однако на этом этапе QuickFIX уже определил, что вход в систему в порядке, и соответствующее сообщение входа будет возвращено получателем, когда обратный вызов вернется.

Как настроить процесс входа в FIX в акцепторе? Является ли изменение кода QuickFIX моей единственной опцией?

Ответы [ 3 ]

6 голосов
/ 27 августа 2010

Если вы используете FIX 4.3 или более позднюю версию, сообщение Logon может иметь тег Password . Если вы используете предыдущую версию, сделайте ее пользовательским тегом и добавьте его в словари.

В обработчике 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();
   }     
}
1 голос
/ 12 мая 2017

Создание RejectLogon QuickFIXException разрывает весь код и прерывает остальные сеансы (если у вас их более одного).В моем собственном случае я составляю сообщение о выходе и отправляю его обратно контрагенту.Код будет примерно таким:

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)
          {
                Message _logoutmess = new Message();
                _logoutmess.Header.SetField(new MsgType() { Tag = 35, Obj = "5" });
                _logoutmess.SetField(new Text("Invalid credentials"));
                Session.SendToTarget(_logoutmess, id);
          }
   }     
}
1 голос
/ 27 августа 2010

fromAdmin уведомляет вас, когда административное сообщение отправлено контрагентом вашему механизму FIX.Это может быть полезно для дополнительной проверки сообщений входа в систему, таких как проверка паролей.Создание исключения RejectLogon приведет к отключению контрагента.

Как правило, проверка сеанса проверяет наличие строки FIX Begin, SenderCompID и целевого CompID.Если эти 3 в порядке, то сеанс настроен (QuickFIXJ имеет другие поля также для подкомпьютеров).

Даже после настройки сеанса сообщения не будут приниматься в акцепторе для этого конкретного сеанса до завершения процесса входа в систему.Вы получите отказ, если попытаетесь это сделать.

Таким образом, в fromAdmin вы можете проверить запрос входящего сообщения о входе в систему и проверить действительный пароль, содержащийся в сообщении о входе в систему, которое вы ожидаете для этого подключения / сеанса.

...