|
7 | 7 | using System.Security.Claims;
|
8 | 8 | using System.Threading.Channels;
|
9 | 9 | using Microsoft.AspNetCore.Authorization;
|
| 10 | +using Microsoft.AspNetCore.Http.Features; |
10 | 11 | using Microsoft.AspNetCore.Internal;
|
| 12 | +using Microsoft.AspNetCore.Routing; |
11 | 13 | using Microsoft.AspNetCore.SignalR.Protocol;
|
12 | 14 | using Microsoft.Extensions.DependencyInjection;
|
13 | 15 | using Microsoft.Extensions.Internal;
|
@@ -549,21 +551,26 @@ private void InitializeHub(THub hub, HubConnectionContext connection)
|
549 | 551 |
|
550 | 552 | private static Task<bool> IsHubMethodAuthorized(IServiceProvider provider, HubConnectionContext hubConnectionContext, HubMethodDescriptor descriptor, object?[] hubMethodArguments, Hub hub)
|
551 | 553 | {
|
| 554 | + var endpoint = hubConnectionContext.Features.Get<IEndpointFeature>()?.Endpoint; |
| 555 | + IReadOnlyList<AuthorizationPolicy> endpointPolicies = endpoint != null |
| 556 | + ? endpoint.Metadata.GetOrderedMetadata<AuthorizationPolicy>() |
| 557 | + : Array.Empty<AuthorizationPolicy>(); |
| 558 | + |
552 | 559 | // 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) |
554 | 561 | {
|
555 | 562 | return TaskCache.True;
|
556 | 563 | }
|
557 | 564 |
|
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)); |
559 | 566 | }
|
560 | 567 |
|
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) |
562 | 569 | {
|
563 | 570 | var authService = provider.GetRequiredService<IAuthorizationService>();
|
564 | 571 | var policyProvider = provider.GetRequiredService<IAuthorizationPolicyProvider>();
|
565 | 572 |
|
566 |
| - var authorizePolicy = await AuthorizationPolicy.CombineAsync(policyProvider, policies); |
| 573 | + var authorizePolicy = await AuthorizationPolicy.CombineAsync(policyProvider, authorizeData, endpointPolicies); |
567 | 574 | // AuthorizationPolicy.CombineAsync only returns null if there are no policies and we check that above
|
568 | 575 | Debug.Assert(authorizePolicy != null);
|
569 | 576 |
|
|
0 commit comments