Добавление обработки ошибок аутентификации для просроченного токена

Я использую graphQl Hot Chocolate V11 с .net Core 3.1. У меня нет проблем с определением срока действия токена, проблема заключается только в передаче этой проблемы обратно запрашивающей стороне.

Я пытаюсь добавить аутентификацию к своим запросам, но у меня возникла проблема с ответом, когда токен авторизации больше не действителен из-за истечения времени или даже по любой другой потенциальной причине, по которой токен недействителен в этом отношении. введите описание изображения здесь

введите описание изображения здесь, но когда я генерирую исключение, чтобы попытаться сообщить запрашивающей стороне, что их токен истек, он не возвращается через стиль IErrorFilter Hot Chocolate, это происходит как ошибка сервера. введите описание изображения здесь, если есть более удобный способ проверить эти вещи и ответить на запрос, может ли кто-нибудь помочь мне? Я бы подумал, что ошибка должна отображаться, как в формате последнего снимка экрана, я думаю, как ответ Hot Chocolate IErrorFilter (ошибка на этом снимке экрана заключается в том, что я не обрабатываю должным образом, когда пользователь не аутентифицирован, поскольку у меня нет currentUser чтобы добавить к контексту, который ожидает запрос)  введите описание изображения здесь


person Aurelius    schedule 26.01.2021    source источник
comment
Я использую Hot Chocolate v10, и он работает так, как и следовало ожидать (ответ AUTH_NOT_AUTHORIZED возвращается как расширение ошибки), так что, возможно, это ошибка регрессии в v11?   -  person keithl8041    schedule 29.01.2021


Ответы (2)


Единственное, что сработало, - это создание моего исключения, подобное этому, это позволило мне добавить правильный код ошибки, но все равно не вернуть в качестве ответа на запрос.

throw new GraphQLRequestException(ErrorBuilder.New()
                                .SetMessage(ExpiredTokenString)
                                .SetCode(ExpiredTokenCode)
                                .Build());
person Aurelius    schedule 29.01.2021

Я не знаю, решит ли это вашу проблему, но это может быть приемлемым обходным решением и иметь другой результат. Используйте это, чтобы обеспечить соблюдение действующей политики безопасности при входе в систему:

            // Add policy in Startup.cs
            services.AddAuthorization(options =>
            {
                options.AddPolicy("LoggedInPolicy", Policies.LoggedInPolicy);
            });

затем добавьте класс политик

    public class Policies
    {
        /// <summary>
        /// Requires the user to be logged in
        /// </summary>
        /// <param name="policy"></param>
        public static void MultiFactorAuthenticationPolicy(AuthorizationPolicyBuilder policy)
        {
            policy.RequireAuthenticatedUser();
        }
    }

А затем украсьте соответствующие конечные точки своим атрибутом авторизации, чтобы применить политику.

        /// <summary>
        /// Test 'hello world' endpoint
        /// </summary>
        /// <returns>The current date/time on the server</returns>
        [Authorize(Policy = "LoggedInPolicy")]
        public string Hello()
        {
            return DateTime.Now.ToString("O");
        }

Возможно, вам также придется добавить это в конфигурацию GraphQL

SchemaBuilder.New()
  ...
  .AddAuthorizeDirectiveType()
  ...
  .Create();

(из https://chillicream.com/docs/hotchocolate/v10/security/, не знаю, насколько это применимо к v11)

Это может быть связано с некоторыми другими обработчиками ошибок.

person keithl8041    schedule 29.01.2021