Skip to content

Commit 56f38e1

Browse files
committed
Try to get endpoint metadata
1 parent a528db3 commit 56f38e1

File tree

2 files changed

+15
-6
lines changed

2 files changed

+15
-6
lines changed

src/SignalR/server/Core/src/Internal/DefaultHubDispatcher.cs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
using System.Security.Claims;
88
using System.Threading.Channels;
99
using Microsoft.AspNetCore.Authorization;
10+
using Microsoft.AspNetCore.Http.Features;
1011
using Microsoft.AspNetCore.Internal;
12+
using Microsoft.AspNetCore.Routing;
1113
using Microsoft.AspNetCore.SignalR.Protocol;
1214
using Microsoft.Extensions.DependencyInjection;
1315
using Microsoft.Extensions.Internal;
@@ -549,21 +551,26 @@ private void InitializeHub(THub hub, HubConnectionContext connection)
549551

550552
private static Task<bool> IsHubMethodAuthorized(IServiceProvider provider, HubConnectionContext hubConnectionContext, HubMethodDescriptor descriptor, object?[] hubMethodArguments, Hub hub)
551553
{
554+
var endpoint = hubConnectionContext.Features.Get<IEndpointFeature>()?.Endpoint;
555+
IReadOnlyList<AuthorizationPolicy> endpointPolicies = endpoint != null
556+
? endpoint.Metadata.GetOrderedMetadata<AuthorizationPolicy>()
557+
: Array.Empty<AuthorizationPolicy>();
558+
552559
// If there are no policies we don't need to run auth
553-
if (descriptor.Policies.Count == 0)
560+
if (descriptor.AuthorizeData.Count == 0 && endpointPolicies.Count == 0)
554561
{
555562
return TaskCache.True;
556563
}
557564

558-
return IsHubMethodAuthorizedSlow(provider, hubConnectionContext.User, descriptor.Policies, new HubInvocationContext(hubConnectionContext.HubCallerContext, provider, hub, descriptor.MethodExecutor.MethodInfo, hubMethodArguments));
565+
return IsHubMethodAuthorizedSlow(provider, hubConnectionContext.User, descriptor.AuthorizeData, endpointPolicies, new HubInvocationContext(hubConnectionContext.HubCallerContext, provider, hub, descriptor.MethodExecutor.MethodInfo, hubMethodArguments));
559566
}
560567

561-
private static async Task<bool> IsHubMethodAuthorizedSlow(IServiceProvider provider, ClaimsPrincipal principal, IList<IAuthorizeData> policies, HubInvocationContext resource)
568+
private static async Task<bool> IsHubMethodAuthorizedSlow(IServiceProvider provider, ClaimsPrincipal principal, IList<IAuthorizeData> authorizeData, IReadOnlyList<AuthorizationPolicy> endpointPolicies, HubInvocationContext resource)
562569
{
563570
var authService = provider.GetRequiredService<IAuthorizationService>();
564571
var policyProvider = provider.GetRequiredService<IAuthorizationPolicyProvider>();
565572

566-
var authorizePolicy = await AuthorizationPolicy.CombineAsync(policyProvider, policies);
573+
var authorizePolicy = await AuthorizationPolicy.CombineAsync(policyProvider, authorizeData, endpointPolicies);
567574
// AuthorizationPolicy.CombineAsync only returns null if there are no policies and we check that above
568575
Debug.Assert(authorizePolicy != null);
569576

src/SignalR/server/Core/src/Internal/HubMethodDescriptor.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ public HubMethodDescriptor(ObjectMethodExecutor methodExecutor, IServiceProvider
9999
OriginalParameterTypes = methodExecutor.MethodParameters.Select(p => p.ParameterType).ToArray();
100100
}
101101

102-
Policies = policies.ToArray();
102+
AuthorizeData = policies.ToArray();
103103
}
104104

105105
public List<Type>? StreamingParameters { get; private set; }
@@ -116,7 +116,9 @@ public HubMethodDescriptor(ObjectMethodExecutor methodExecutor, IServiceProvider
116116

117117
public Type? StreamReturnType { get; }
118118

119-
public IList<IAuthorizeData> Policies { get; }
119+
public IList<IAuthorizeData> AuthorizeData { get; }
120+
121+
public IReadOnlyList<AuthorizationPolicy> EndpointPolicies { get; }
120122

121123
public bool HasSyntheticArguments { get; private set; }
122124

0 commit comments

Comments
 (0)