gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:52:35 25 4
gpt4 key购买 nike

我想检查 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();
});

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

最佳答案

您可以通过在客户端尝试发布/订阅无效主题时断开客户端连接来实现这一点。

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

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

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

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

关于c# - 在 C# asp.net core 2.1 中通过用户名和密码在 MQTT 服务器上验证 MQTT 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54120848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com