7

我正在使用 QuickFIX 和 C# 创建一个 FIX 接受器(服务器)。我希望客户端(FIX 发起者)使用用户名和密码登录。但是,我不确定如何在 QuickFIX 中做到这一点。

通过调试 QuickFIX 源代码,我发现了以下事件序列:

  • QuickFIX 将调用Session::verify以验证登录。
  • Session::verify将执行各种检查,如 comp ID 和序列号,并在某些时候确定收到的登录是有效的。
  • Session::verify然后将调用Application::fromAdmin回调,我认为这是自定义登录等内容的自然位置。
  • 但是,此时 QuickFIX 已经确定登录成功,并且在回调返回时接受器将返回相应的登录消息。

如何在接受者中自定义 FIX 登录过程?修改 QuickFIX 代码是我唯一的选择吗?

4

3 回答 3

6

如果您使用的是 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();
   }     
}
于 2010-08-27T09:25:10.927 回答
1

当管理消息从交易对手发送到您的 FIX 引擎时,fromAdmin 会通知您。这对于对登录消息进行额外验证(例如检查密码)很有用。抛出 RejectLogon 异常将断开对方。

会话验证通常检查 FIX 开始字符串、SenderCompID 和目标 CompID。如果这 3 个没问题,那么会话就设置好了(QuickFIXJ 也有其他字段用于 subcomp id)。

即使在会话设置完成后,接收方也不会接受该特定会话的消息,直到登录过程完成。如果您尝试这样做,您将被拒绝。

因此,在 fromAdmin 中,您可以检查传入的登录消息请求并检查登录消息中包含的有效密码,您期望该连接/会话。

于 2010-08-27T09:24:23.593 回答
1

抛出 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);
          }
   }     
}
于 2017-05-12T05:10:01.040 回答