![](/img/trans.png)
[英]C# ASP.NET Core 2.1 Linux NTLM Apache 2.2 - Get username?
[英]Authenticating MQTT client on the MQTT server by username and password in C# asp.net core 2.1
我想在MQTT服務器中檢查MQTT客戶端的用戶名和密碼,然后允許其連接。 我實現了一個服務器並從設備發送數據。 我得到了數據,但問題是身份驗證無法正常運行,因為我需要根據客戶端發送的主題從DB獲取客戶端信息。 到目前為止我做了什么如下:
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()
在服務器上的所有會話列表中查找客戶端,可以顯式斷開客戶端。 然后在客戶端會話上調用DisconnectAsync()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.