HandleRequirementAsync не вызывается при использовании авторизации в Hot Chocolate

Hi,

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

What I want to achieve

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

What I've done
  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>());
        }
  1. У меня 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
    {
    }
  1. Я объявил одно поле, требующее авторизации политики.
    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. Этот метод всегда должен приносить успех. Однако при запросе user. На самом деле происходит то, что метод не вызывается, и запрос немедленно отклоняется следующим ответом:

{
  "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"
      }
    }
  ]
}

person NoamWe    schedule 05.04.2020    source источник


Ответы (1)


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

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

я имел

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

сначала и потом

app.UseWebSockets()
                .UseGraphQL("/graphql")
                .UsePlayground("/graphql")
                .UseVoyager("/graphql");
person Volodymyr Otryshko    schedule 18.04.2020