Настройка процесса входа в систему FIX в акцепторе QuickFIX

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

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

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

как настроить процесс входа в систему FIX в акцепторе? Изменяет код QuickFIX мой единственный вариант?

3 ответов


Если вы используете 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 уведомляет вас, когда административное сообщение отправляется от контрагента в механизм исправления. Это может быть полезно для дополнительной проверки сообщений входа в систему, таких как проверка паролей. Исключение RejectLogon приведет к отключению контрагента.

проверка сеанса обычно ckecks для строки начала исправления, SenderCompID и целевого CompID. Если это 3 в порядке, то сеанс настроен(QuickFIXJ имеет другие поля также для подкомпа идентификационная карточка.)

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

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


бросание 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);
          }
   }     
}