Skip to content

Commit 6793dcd

Browse files
authored
Improve GraphQL content item authorization handling (#19098)
1 parent be0513d commit 6793dcd

2 files changed

Lines changed: 6 additions & 11 deletions

File tree

src/OrchardCore.Modules/OrchardCore.Apis.GraphQL/GraphQLMiddleware.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ private async Task ExecuteAsync(HttpContext context)
158158
options.OperationName = request.OperationName;
159159
options.Variables = request.Variables;
160160
options.UserContext = _settings.BuildUserContext?.Invoke(context);
161+
options.User = context.User;
161162
options.ValidationRules = DocumentValidator.CoreRules
162163
.Concat(context.RequestServices.GetServices<IValidationRule>())
163164
.Append(new ComplexityValidationRule(new ComplexityOptions

src/OrchardCore/OrchardCore.ContentManagement.GraphQL/Queries/ContentItemQuery.cs

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,19 @@
22
using GraphQL.Resolvers;
33
using GraphQL.Types;
44
using Microsoft.AspNetCore.Authorization;
5-
using Microsoft.AspNetCore.Http;
65
using Microsoft.Extensions.DependencyInjection;
76
using Microsoft.Extensions.Localization;
87
using OrchardCore.Apis.GraphQL;
98
using OrchardCore.ContentManagement.GraphQL.Queries.Types;
10-
using ContentsCommonPermissions = OrchardCore.Contents.CommonPermissions;
119

1210
namespace OrchardCore.ContentManagement.GraphQL.Queries;
1311

1412
public sealed class ContentItemQuery : ISchemaBuilder
1513
{
16-
private readonly IHttpContextAccessor _httpContextAccessor;
17-
1814
internal readonly IStringLocalizer S;
1915

20-
public ContentItemQuery(IHttpContextAccessor httpContextAccessor,
21-
IStringLocalizer<ContentItemQuery> localizer)
16+
public ContentItemQuery(IStringLocalizer<ContentItemQuery> localizer)
2217
{
23-
_httpContextAccessor = httpContextAccessor;
2418
S = localizer;
2519
}
2620

@@ -53,10 +47,9 @@ public Task BuildAsync(ISchema schema)
5347

5448
private async ValueTask<ContentItem> ResolveAsync(IResolveFieldContext context)
5549
{
56-
var httpContext = _httpContextAccessor.HttpContext;
5750
var contentItemId = context.GetArgument<string>("contentItemId");
58-
var contentManager = httpContext.RequestServices.GetRequiredService<IContentManager>();
59-
var authorizationService = httpContext.RequestServices.GetRequiredService<IAuthorizationService>();
51+
var contentManager = context.RequestServices.GetService<IContentManager>();
52+
var authorizationService = context.RequestServices.GetService<IAuthorizationService>();
6053

6154
var contentItem = await contentManager.GetAsync(contentItemId);
6255

@@ -65,8 +58,9 @@ private async ValueTask<ContentItem> ResolveAsync(IResolveFieldContext context)
6558
return null;
6659
}
6760

68-
if (!await authorizationService.AuthorizeAsync(httpContext.User, ContentsCommonPermissions.ViewContent, contentItem))
61+
if (!await authorizationService.AuthorizeAsync(context.User, Contents.CommonPermissions.ViewContent, contentItem))
6962
{
63+
// Return null if the user doesn't have permission to view the content item, so that it doesn't appear in the GraphQL response.
7064
return null;
7165
}
7266

0 commit comments

Comments
 (0)