From 632ece252ce8d07142b1eb77de1377999154817d Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 3 Nov 2021 17:45:20 +0800 Subject: [PATCH] Switch to `ClaimsPrincipal` in `HubContext` in SignalR. --- .../SignalR/AbpAspNetCoreSignalRModule.cs | 5 ++- .../AspNetCore/SignalR/AbpSignalRHubFilter.cs | 38 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 framework/src/Volo.Abp.AspNetCore.SignalR/Volo/Abp/AspNetCore/SignalR/AbpSignalRHubFilter.cs diff --git a/framework/src/Volo.Abp.AspNetCore.SignalR/Volo/Abp/AspNetCore/SignalR/AbpAspNetCoreSignalRModule.cs b/framework/src/Volo.Abp.AspNetCore.SignalR/Volo/Abp/AspNetCore/SignalR/AbpAspNetCoreSignalRModule.cs index 23fece372f..767f81b452 100644 --- a/framework/src/Volo.Abp.AspNetCore.SignalR/Volo/Abp/AspNetCore/SignalR/AbpAspNetCoreSignalRModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.SignalR/Volo/Abp/AspNetCore/SignalR/AbpAspNetCoreSignalRModule.cs @@ -32,7 +32,10 @@ namespace Volo.Abp.AspNetCore.SignalR public override void ConfigureServices(ServiceConfigurationContext context) { var routePatterns = new List {"/signalr-hubs"}; - var signalRServerBuilder = context.Services.AddSignalR(); + var signalRServerBuilder = context.Services.AddSignalR(options => + { + options.AddFilter(); + }); context.Services.ExecutePreConfiguredActions(signalRServerBuilder); diff --git a/framework/src/Volo.Abp.AspNetCore.SignalR/Volo/Abp/AspNetCore/SignalR/AbpSignalRHubFilter.cs b/framework/src/Volo.Abp.AspNetCore.SignalR/Volo/Abp/AspNetCore/SignalR/AbpSignalRHubFilter.cs new file mode 100644 index 0000000000..2695629304 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.SignalR/Volo/Abp/AspNetCore/SignalR/AbpSignalRHubFilter.cs @@ -0,0 +1,38 @@ +using System; +using System.Threading.Tasks; +using Microsoft.AspNetCore.SignalR; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Security.Claims; + +namespace Volo.Abp.AspNetCore.SignalR +{ + public class AbpSignalRHubFilter : IHubFilter + { + public virtual async ValueTask InvokeMethodAsync(HubInvocationContext invocationContext, Func> next) + { + var currentPrincipalAccessor = invocationContext.ServiceProvider.GetRequiredService(); + using (currentPrincipalAccessor.Change(invocationContext.Context.User)) + { + return await next(invocationContext); + } + } + + public virtual async Task OnConnectedAsync(HubLifetimeContext context, Func next) + { + var currentPrincipalAccessor = context.ServiceProvider.GetRequiredService(); + using (currentPrincipalAccessor.Change(context.Context.User)) + { + await next(context); + } + } + + public virtual async Task OnDisconnectedAsync(HubLifetimeContext context, Exception exception, Func next) + { + var currentPrincipalAccessor = context.ServiceProvider.GetRequiredService(); + using (currentPrincipalAccessor.Change(context.Context.User)) + { + await next(context, exception); + } + } + } +}