0

我正在使用带有 .net Core 3.1 的 graphQl Hot Chocolate V11 我对令牌过期的识别没有任何问题,它只是将该问题转发给请求者就是问题所在。

我正在尝试向我的请求添加一些身份验证,但是当授权令牌由于时间到期或什至令牌对此无效的任何其他潜在原因而不再有效时,我在响应时遇到问题。 在此处输入图像描述

在此处输入图像描述 但是当我抛出异常以尝试告诉请求者他们的令牌已过期时,它不会通过 Hot Chocolate IErrorFilter 样式返回,它就像服务器错误一样出现。 在此处输入图像描述 如果有任何更好的内置方法来检查这些事情并正确回应请求者,有人可以帮我吗?我会莫尔斯认为错误应该以最后一个屏幕截图的格式显示,我猜是热巧克力 IErrorFilter 响应(该屏幕截图中的错误是如果当用户未通过身份验证时我没有正确处理,因为我没有 currentUser添加到查询所期望的上下文中) 在此处输入图像描述

4

2 回答 2

0

semi 唯一起作用的是像这样创建我的异常,它允许我添加正确的错误代码,但仍然不返回作为查询的答案

throw new GraphQLRequestException(ErrorBuilder.New()
                                .SetMessage(ExpiredTokenString)
                                .SetCode(ExpiredTokenCode)
                                .Build());
于 2021-01-29T12:37:07.453 回答
0

我不知道这是否会解决您的问题,但这可能是一种可接受的解决方法,并且会产生不同的结果。使用它来强制执行有效的 is-logged-in 安全策略:

            // 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)

这可能与一些不同的错误处理程序有关。

于 2021-01-29T12:54:51.150 回答