Аутентификация клиента MQTT на сервере MQTT по имени пользователя и паролю в C # asp.net core 2.1 - PullRequest
0 голосов
/ 10 января 2019

Я хочу проверить имя пользователя и пароль клиента 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();
});

Я могу получить запросы в моем методе, но мне сложно проверить имя пользователя и пароль.

1 Ответ

0 голосов
/ 10 января 2019

Это можно реализовать, отключив клиент при попытке опубликовать / подписаться на недопустимую тему.

Это означает использование авторизации вместо аутентификации для обеспечения соблюдения вашей политики. Аутентификация может быть выполнена только с использованием параметров, которые доступны в сообщении MQTT-соединения, например идентификатор клиента, пароль.

Поэтому для этого необходимо настроить обработчик событий ConnectionValidator при запуске сервера. Он может записывать идентификатор клиента и пароль, с которыми клиент пытается соединиться, и всегда разрешать установление соединения.

Обработчик события ApplicationMessageReceived будет вызываться, когда клиент публикует / подписывается на тему. Этот обработчик событий может проверить идентификатор клиента и пароль, которые были переданы, когда клиент подключился к клиенту в вашей базе данных (используя тему, как вам нужно). Если путь, идентификатор клиента и пароль недействительны, вам необходимо явно отключить клиента.

Клиент может быть явно отключен, найдя клиента в списке всех сеансов на сервере, используя mqttServer.GetClientSessionsStatus(). Затем вызовите DisconnectAsync() в сеансе клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...