Browse Source

Always `CheckDynamicClaims` on `OnConnectedAsync` and `OnDisconnectedAsync` method.

pull/19742/head
maliming 2 years ago
parent
commit
ffc94a29e5
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 23
      framework/src/Volo.Abp.AspNetCore.SignalR/Volo/Abp/AspNetCore/SignalR/Authentication/AbpAuthenticationHubFilter.cs

23
framework/src/Volo.Abp.AspNetCore.SignalR/Volo/Abp/AspNetCore/SignalR/Authentication/AbpAuthenticationHubFilter.cs

@ -16,7 +16,7 @@ public class AbpAuthenticationHubFilter : IHubFilter
{ {
var currentPrincipalAccessor = invocationContext.ServiceProvider.GetRequiredService<ICurrentPrincipalAccessor>(); var currentPrincipalAccessor = invocationContext.ServiceProvider.GetRequiredService<ICurrentPrincipalAccessor>();
var claimsPrincipal = invocationContext.Context.User; var claimsPrincipal = invocationContext.Context.User;
await HandleDynamicClaimsPrincipalAsync(claimsPrincipal, invocationContext.ServiceProvider, invocationContext.Context); await HandleDynamicClaimsPrincipalAsync(claimsPrincipal, invocationContext.ServiceProvider, invocationContext.Context, false);
using (currentPrincipalAccessor.Change(claimsPrincipal!)) using (currentPrincipalAccessor.Change(claimsPrincipal!))
{ {
return await next(invocationContext); return await next(invocationContext);
@ -27,7 +27,7 @@ public class AbpAuthenticationHubFilter : IHubFilter
{ {
var currentPrincipalAccessor = context.ServiceProvider.GetRequiredService<ICurrentPrincipalAccessor>(); var currentPrincipalAccessor = context.ServiceProvider.GetRequiredService<ICurrentPrincipalAccessor>();
var claimsPrincipal = context.Context.User; var claimsPrincipal = context.Context.User;
await HandleDynamicClaimsPrincipalAsync(claimsPrincipal, context.ServiceProvider, context.Context); await HandleDynamicClaimsPrincipalAsync(claimsPrincipal, context.ServiceProvider, context.Context, true);
using (currentPrincipalAccessor.Change(claimsPrincipal!)) using (currentPrincipalAccessor.Change(claimsPrincipal!))
{ {
await next(context); await next(context);
@ -38,21 +38,23 @@ public class AbpAuthenticationHubFilter : IHubFilter
{ {
var currentPrincipalAccessor = context.ServiceProvider.GetRequiredService<ICurrentPrincipalAccessor>(); var currentPrincipalAccessor = context.ServiceProvider.GetRequiredService<ICurrentPrincipalAccessor>();
var claimsPrincipal = context.Context.User; var claimsPrincipal = context.Context.User;
await HandleDynamicClaimsPrincipalAsync(claimsPrincipal, context.ServiceProvider, context.Context); await HandleDynamicClaimsPrincipalAsync(claimsPrincipal, context.ServiceProvider, context.Context, true);
using (currentPrincipalAccessor.Change(claimsPrincipal!)) using (currentPrincipalAccessor.Change(claimsPrincipal!))
{ {
await next(context, exception); await next(context, exception);
} }
} }
protected virtual async Task HandleDynamicClaimsPrincipalAsync(ClaimsPrincipal? claimsPrincipal, IServiceProvider serviceProvider, HubCallerContext hubCallerContext) protected virtual async Task HandleDynamicClaimsPrincipalAsync(ClaimsPrincipal? claimsPrincipal, IServiceProvider serviceProvider, HubCallerContext hubCallerContext, bool skipCheckDynamicClaimsInterval)
{ {
if (claimsPrincipal?.Identity != null && if (claimsPrincipal?.Identity != null &&
claimsPrincipal.Identity.IsAuthenticated && claimsPrincipal.Identity.IsAuthenticated &&
serviceProvider.GetRequiredService<IOptions<AbpClaimsPrincipalFactoryOptions>>().Value.IsDynamicClaimsEnabled) serviceProvider.GetRequiredService<IOptions<AbpClaimsPrincipalFactoryOptions>>().Value
.IsDynamicClaimsEnabled)
{ {
var checkDynamicClaimsInterval = serviceProvider.GetRequiredService<IOptions<AbpSignalROptions>>().Value.CheckDynamicClaimsInterval; var checkDynamicClaimsInterval = serviceProvider.GetRequiredService<IOptions<AbpSignalROptions>>().Value.CheckDynamicClaimsInterval;
if (checkDynamicClaimsInterval.HasValue && if (!skipCheckDynamicClaimsInterval &&
checkDynamicClaimsInterval.HasValue &&
hubCallerContext.Items.TryGetValue(nameof(HandleDynamicClaimsPrincipalAsync), out var lastCheckDynamicClaimsTime) && hubCallerContext.Items.TryGetValue(nameof(HandleDynamicClaimsPrincipalAsync), out var lastCheckDynamicClaimsTime) &&
lastCheckDynamicClaimsTime is DateTime lastCheckDynamicClaimsTimeValue) lastCheckDynamicClaimsTime is DateTime lastCheckDynamicClaimsTimeValue)
{ {
@ -66,10 +68,13 @@ public class AbpAuthenticationHubFilter : IHubFilter
hubCallerContext.Items[nameof(HandleDynamicClaimsPrincipalAsync)] = DateTime.UtcNow; hubCallerContext.Items[nameof(HandleDynamicClaimsPrincipalAsync)] = DateTime.UtcNow;
claimsPrincipal = claimsPrincipal.Identity is ClaimsIdentity identity claimsPrincipal = claimsPrincipal.Identity is ClaimsIdentity identity
? new ClaimsPrincipal(new ClaimsIdentity(claimsPrincipal.Claims, claimsPrincipal.Identity.AuthenticationType, identity.NameClaimType, identity.RoleClaimType)) ? new ClaimsPrincipal(new ClaimsIdentity(claimsPrincipal.Claims,
: new ClaimsPrincipal(new ClaimsIdentity(claimsPrincipal.Claims, claimsPrincipal.Identity.AuthenticationType)); claimsPrincipal.Identity.AuthenticationType, identity.NameClaimType, identity.RoleClaimType))
: new ClaimsPrincipal(new ClaimsIdentity(claimsPrincipal.Claims,
claimsPrincipal.Identity.AuthenticationType));
claimsPrincipal = await serviceProvider.GetRequiredService<IAbpClaimsPrincipalFactory>().CreateDynamicAsync(claimsPrincipal); claimsPrincipal = await serviceProvider.GetRequiredService<IAbpClaimsPrincipalFactory>()
.CreateDynamicAsync(claimsPrincipal);
if (claimsPrincipal.Identity?.IsAuthenticated == false) if (claimsPrincipal.Identity?.IsAuthenticated == false)
{ {
hubCallerContext.Abort(); hubCallerContext.Abort();

Loading…
Cancel
Save