在 C# asp.net core 2.1 中通过用户名和密码在 MQTT 服务器上验证 MQTT 客户端

Authenticating MQTT client on the MQTT server by username and password in C# asp.net core 2.1

我想检查 MQTT 服务器中 MQTT 客户端的用户名和密码,然后允许其连接。我实现了一个服务器并从设备发送数据。我得到了数据,但问题是身份验证无法正常工作,因为我需要根据客户端发送的主题从数据库中获取客户端信息。到目前为止我做了什么如下:

public async Task Received()
{
  var options = new MqttServerOptions();                
  var mqttServer = new MqttFactory().CreateMqttServer();
  mqttServer.ApplicationMessageReceived += (sender, eventArgs) =>
  {    
    var path = eventArgs.ApplicationMessage.Topic;
    var device= GetDevice(path);   

    options.ConnectionValidator = p =>
    {    
      if (p.Username != device.username || p.Password != device.password)
      {
        p.ReturnCode = MqttConnectReturnCode.ConnectionRefusedBadUsernameOrPassword;
      }
    };
  };

  mqttServer.ClientConnected += (s, e) => { };

  mqttServer.ClientDisconnected += (s, e) => { };

  mqttServer.ClientSubscribedTopic += (s, e) => { };

  mqttServer.ClientUnsubscribedTopic += (s, e) => { };

  mqttServer.Started += (s, e) => { };

  mqttServer.Stopped += (s, e) => { };

  await mqttServer.StartAsync(options);
}

并且这段代码在我的启动程序中

app.UseMqttServer(server =>
{
  server.Started += async (sender, args) => await myClass.Received();
});

我可以通过我的方法获取请求,但我很难检查用户名和密码。

您可以通过在客户端尝试 publish/subscribe 无效主题时断开客户端连接来实现此目的。

这意味着使用授权而不是身份验证来执行您的策略。身份验证只能使用 MQTT 连接消息中可用的参数来完成,例如客户ID,密码。

为此,需要在服务器启动时设置 ConnectionValidator 事件处理程序。它可以记录客户端尝试连接的客户端 ID 和密码,并始终允许连接继续进行。

当客户端 publishes/subscribes 访问主题时,将调用 ApplicationMessageReceived 事件处理程序。此事件处理程序可以验证客户端连接到数据库中的客户端时传入的客户端 ID 和密码(根据需要使用主题)。如果路径、客户端 ID 和密码无效,那么您需要明确断开客户端连接。

可以通过使用 mqttServer.GetClientSessionsStatus() 在服务器上的所有会话列表中找到客户端来显式断开客户端连接。然后在客户端会话上调用 DisconnectAsync()