diff --git a/Source/MQTTnet.AspnetCore/ApplicationBuilderExtensions.cs b/Source/MQTTnet.AspnetCore/ApplicationBuilderExtensions.cs index 2125c7df..4c6a45f0 100644 --- a/Source/MQTTnet.AspnetCore/ApplicationBuilderExtensions.cs +++ b/Source/MQTTnet.AspnetCore/ApplicationBuilderExtensions.cs @@ -30,8 +30,7 @@ namespace MQTTnet.AspNetCore var adapter = app.ApplicationServices.GetRequiredService(); using (var webSocket = await context.WebSockets.AcceptWebSocketAsync(subProtocol)) { - var endpoint = $"{context.Connection.RemoteIpAddress}:{context.Connection.RemotePort}"; - await adapter.RunWebSocketConnectionAsync(webSocket, endpoint); + await adapter.RunWebSocketConnectionAsync(webSocket, context); } }); diff --git a/Source/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs b/Source/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs index ac77f166..e5720e7a 100644 --- a/Source/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs +++ b/Source/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs @@ -1,6 +1,7 @@ using System; using System.Net.WebSockets; using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; using MQTTnet.Adapter; using MQTTnet.Diagnostics; using MQTTnet.Formatter; @@ -11,6 +12,15 @@ namespace MQTTnet.AspNetCore { public class MqttWebSocketServerAdapter : IMqttServerAdapter { + private readonly IMqttNetChildLogger _logger; + + public MqttWebSocketServerAdapter(IMqttNetChildLogger logger) + { + if (logger == null) throw new ArgumentNullException(nameof(logger)); + + _logger = logger.CreateChildLogger(nameof(MqttTcpServerAdapter)); + } + public Action ClientAcceptedHandler { get; set; } public Task StartAsync(IMqttServerOptions options) @@ -23,11 +33,17 @@ namespace MQTTnet.AspNetCore return Task.CompletedTask; } - public async Task RunWebSocketConnectionAsync(WebSocket webSocket, string endpoint) + public async Task RunWebSocketConnectionAsync(WebSocket webSocket, HttpContext httpContext) { if (webSocket == null) throw new ArgumentNullException(nameof(webSocket)); - var clientAdapter = new MqttChannelAdapter(new MqttWebSocketChannel(webSocket, endpoint), new MqttPacketFormatterAdapter(), new MqttNetLogger().CreateChildLogger(nameof(MqttWebSocketServerAdapter))); + var endpoint = $"{httpContext.Connection.RemoteIpAddress}:{httpContext.Connection.RemotePort}"; + var channel = new MqttWebSocketChannel(webSocket, endpoint); + var clientAdapter = new MqttChannelAdapter(channel, new MqttPacketFormatterAdapter(), _logger.CreateChildLogger(nameof(MqttWebSocketServerAdapter))); + + var clientCertificate = await httpContext.Connection.GetClientCertificateAsync().ConfigureAwait(false); + var isSecureConnection = clientCertificate != null; + clientCertificate?.Dispose(); var eventArgs = new MqttServerAdapterClientAcceptedEventArgs(clientAdapter); ClientAcceptedHandler?.Invoke(eventArgs); diff --git a/Source/MQTTnet.Server/MQTTnet.Server.csproj b/Source/MQTTnet.Server/MQTTnet.Server.csproj index 3e5d224b..26ba48aa 100644 --- a/Source/MQTTnet.Server/MQTTnet.Server.csproj +++ b/Source/MQTTnet.Server/MQTTnet.Server.csproj @@ -36,13 +36,13 @@ Always - Always + Never - Always + Never - Always + Never @@ -76,7 +76,7 @@ - Always + Never diff --git a/Source/MQTTnet.Server/Mqtt/MqttServerService.cs b/Source/MQTTnet.Server/Mqtt/MqttServerService.cs index c3abcf0c..7a5d7577 100644 --- a/Source/MQTTnet.Server/Mqtt/MqttServerService.cs +++ b/Source/MQTTnet.Server/Mqtt/MqttServerService.cs @@ -30,7 +30,6 @@ namespace MQTTnet.Server.Mqtt public MqttServerService( Configuration.SettingsModel settings, CustomMqttFactory mqttFactory, - MqttWebSocketServerAdapter webSocketServerAdapter, MqttClientConnectedHandler mqttClientConnectedHandler, MqttClientDisconnectedHandler mqttClientDisconnectedHandler, MqttClientSubscribedTopicHandler mqttClientSubscribedTopicHandler, @@ -52,15 +51,19 @@ namespace MQTTnet.Server.Mqtt _pythonScriptHostService = pythonScriptHostService ?? throw new ArgumentNullException(nameof(pythonScriptHostService)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + WebSocketServerAdapter = new MqttWebSocketServerAdapter(mqttFactory.Logger.CreateChildLogger()); + var adapters = new List { - new MqttTcpServerAdapter(mqttFactory.Logger.CreateChildLogger(nameof(MqttTcpServerAdapter))), - webSocketServerAdapter + new MqttTcpServerAdapter(mqttFactory.Logger.CreateChildLogger()), + WebSocketServerAdapter }; _mqttServer = mqttFactory.CreateMqttServer(adapters); } + public MqttWebSocketServerAdapter WebSocketServerAdapter { get; } + public void Configure() { _pythonScriptHostService.RegisterProxyObject("publish", new Action(Publish)); diff --git a/Source/MQTTnet.Server/Startup.cs b/Source/MQTTnet.Server/Startup.cs index 659f5057..058e7e94 100644 --- a/Source/MQTTnet.Server/Startup.cs +++ b/Source/MQTTnet.Server/Startup.cs @@ -1,11 +1,9 @@ using System; -using System.Net.WebSockets; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using MQTTnet.AspNetCore; using MQTTnet.Server.Logging; using MQTTnet.Server.Mqtt; using MQTTnet.Server.Scripting; @@ -31,8 +29,7 @@ namespace MQTTnet.Server IHostingEnvironment environment, MqttServerService mqttServerService, PythonScriptHostService pythonScriptHostService, - DataSharingService dataSharingService, - MqttWebSocketServerAdapter mqttWebSocketServerAdapter) + DataSharingService dataSharingService) { if (environment.IsDevelopment()) { @@ -64,8 +61,7 @@ namespace MQTTnet.Server { using (var webSocket = await context.WebSockets.AcceptWebSocketAsync().ConfigureAwait(false)) { - await mqttWebSocketServerAdapter.RunWebSocketConnectionAsync(webSocket, - $"{context.Connection.RemoteIpAddress}:{context.Connection.RemotePort}").ConfigureAwait(false); + await mqttServerService.WebSocketServerAdapter.RunWebSocketConnectionAsync(webSocket, context).ConfigureAwait(false); } } else @@ -99,7 +95,6 @@ namespace MQTTnet.Server services.AddSingleton(); services.AddSingleton(); - services.AddSingleton(); services.AddSingleton(); services.AddSingleton();