HandleRequirementAsyn c не вызывается при использовании авторизации в Hot Chocolate - PullRequest
2 голосов
/ 05 апреля 2020
Привет,

Я пытаюсь реализовать авторизацию на основе политик на сервере Hot Chocolate graphql. Я просматриваю их документацию , а также ссылаюсь на Руководство Microsoft

Чего я хочу достичь

Я хочу, чтобы HandleRequirementAsync() вызывался всякий раз, когда User query

Что я сделал
  1. Я регистрирую авторизацию и User Policy в ConfigureServices
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddHttpContextAccessor();
            services.AddAuthorization(options =>
            {
                options.AddPolicy("UserPolicy",
                policy => policy.Requirements.Add(new UserRequirement()));
            });


            services.AddSingleton<Query>();

            services.AddSingleton<IAuthorizationHandler, UserAuthorizationHandler>();

            services.AddSingleton(typeof(IUserRepo), typeof(UserRepo));
            services.AddSingleton(typeof(IBookRepository), typeof(BookRepository));

            services.AddGraphQL(
                SchemaBuilder.New()
                    .AddAuthorizeDirectiveType()
                    .AddType<UserType>()
                    .AddType<BookType>()
                    .AddQueryType<Query>());
        }
У меня есть User requirement class и handler
 public class UserAuthorizationHandler : AuthorizationHandler<UserRequirement, IResolverContext>
    {
        private IHttpContextAccessor _accessor;

        public UserAuthorizationHandler([Service] IHttpContextAccessor accessor)
        {
            _accessor = accessor;
        }

        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, UserRequirement requirement,
            IResolverContext resource)
        {
            context.Succeed(requirement);
            return Task.CompletedTask;
        }
    }

    public class UserRequirement : IAuthorizationRequirement
    {
    }
Я объявил одно поле, требующее авторизации политики.
    public class UserType
        : ObjectType<User>
    {
        protected override void Configure(IObjectTypeDescriptor<User> descriptor)
        {
            descriptor.Field(t => t.Name).Type<NonNullType<StringType>>().Authorize("UserPolicy");
            descriptor.Field(t => t.Id).Type<NonNullType<StringType>>();
        }
    }

Проблема

При запуске этого кода. Я ожидаю, что HandleRequirementAsync будет вызван. Этот метод всегда должен быть успешным. Тем не менее, при запросе для пользователя. На самом деле происходит то, что метод не вызывается, и запрос немедленно отклоняется следующим ответом:

{
  "errors": [
    {
      "message": "The current user is not authorized to access this resource.",
      "locations": [
        {
          "line": 3,
          "column": 5
        }
      ],
      "path": [
        "user",
        "name"
      ],
      "extensions": {
        "code": "AUTH_NOT_AUTHENTICATED"
      }
    }
  ]
}

1 Ответ

0 голосов
/ 18 апреля 2020

У меня просто была похожая проблема. В моем случае я должен был убедиться, что в

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

у меня было

app.UseAuthentication();
app.UseAuthorization();

сначала и затем

app.UseWebSockets()
                .UseGraphQL("/graphql")
                .UsePlayground("/graphql")
                .UseVoyager("/graphql");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...