MQTT Samples - Authentication
You can do authentication in 2 ways. You can use the VerifyConnection
method on the MqttBridge
and check the Username
and Password
from the Mqtt client. However, you can also use the XSockets AuthenticationPipeline
module to create a IPrincipal
for the connection. Once you have the principal you can use that in all the methods in the MqttBridge
to (for example) get role based authentication
.
Both ways are described below.
MqttMsgConnect
This method use only the MqttMsgConnect to validate the user.
/// <summary>
/// Verify by using the MqttMsgConnect
/// </summary>
public class MyMqttBride : MqttBridge
{
public override bool VerifyConnection(MqttMsgConnect message, MqttClient client)
{
if (message.Password == "secret4you" && message.Username == "ron-burgundy")
{
return true;
}
return false;
}
}
You can set the credentials in the MQTT.fx
client under setting/user credentials
Authentication Pipeline
Now we take a look at how to create a IPrincipal
to be used in the MqttBridge
.
[Export(typeof(IXSocketAuthenticationPipeline))]
public class MyAuthPipeline : IXSocketAuthenticationPipeline
{
public IPrincipal GetPrincipal(IXSocketProtocol protocol)
{
if (protocol.ConnectionContext.User == null)
{
//You can access to MQTT connection info like this
var mqttinfo = (MqttMsgConnect)protocol.ConnectionContext.Environment["mqttclient"];
if (mqttinfo != null)
if (mqttinfo.Password == "secret4you" && mqttinfo.Username == "ron-burgundy")
{
//You will find user info on the ConnectionContext
//fake, implement your own logic to set the User
var roles = new string[] { "superman", "hulk" };
var userIdentity = new GenericIdentity("Run Burgundy");
return new GenericPrincipal(userIdentity, roles);
}
}
return protocol.ConnectionContext.User;
}
}
/// <summary>
/// Verify by using the XSockets AuthPipeline
/// </summary>
public class MyMqttBride : MqttBridge
{
public override bool VerifyConnection(MqttMsgConnect message, MqttClient client)
{
if (client.ConnectionContext.User != null && client.ConnectionContext.User.IsInRole("superman"))
{
return true;
}
return false;
}
}