【问题标题】:.Net core JWT Custom Expired Token Response.Net core JWT 自定义过期令牌响应
【发布时间】:2019-12-22 17:28:47
【问题描述】:

我已将我的 Web API 配置为使用 JWT 和一次性刷新令牌。

但是,我想修改标准 JWT 中间件,以使用响应标头而不是标准 HTTP 401 响应来响应具有 HTTP 200 过期令牌的客户。

我已将此代码添加到 services.AddAuthentication() 启动配置中。

            services.AddAuthentication()
            .AddJwtBearer("Bearer", options =>
            {
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    NameClaimType = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier",
                    ValidateAudience = false,
                    ValidateIssuer = false,
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Tokens:Key"])),
                    ValidateLifetime = true,
                    ClockSkew = TimeSpan.Zero //the default for this setting is 5 minutes
                };
                options.Events = new JwtBearerEvents
                {
                    OnAuthenticationFailed = context =>
                    {
                        if (context.Exception.GetType() == typeof(SecurityTokenExpiredException))
                        {
                            context.Response.Headers.Add("Token-Expired", "True");
                            context.Response.StatusCode = 200;
                        }
                        return Task.CompletedTask;
                    }
                };
            });

但是返回给客户端的响应仍然是 HTTP 401。所以我错过了什么吗?

【问题讨论】:

  • 在这里打断点:context.Response.Headers.Add("Token-Expired", "True");并检查是否有另一个标头已经在响应中报告了失败。如果是这样,请在添加之前将其删除

标签: c# asp.net-core jwt


【解决方案1】:

返回 Task.Completed 并不一定会结束中间件管道。它继续前进,最终到达 app.UseMvc(),这会将状态代码设置为 401。

您需要在 app.UseAuthentication() 管道之后但在 app.UseMvc() 之前短路管道;

这是中间件代码:

    public class ExpiredTokenMiddleware
    {
        private readonly RequestDelegate _next;

        public ExpiredTokenMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext context)
        {
            if (context.Response.Headers["Token-Expired"] == "True")
            {
                context.Response.StatusCode = 200;

                // DO NOT CALL NEXT. THIS SHORTCIRCUITS THE PIPELINE
            }
            else
            {
                await _next(context);
            }
        }
    }

然后在你的startup.cs中插入中间件在两者之间。

        app.UseAuthentication();
        app.UseMiddleware<ExpiredTokenMiddleware>();
        app.UseMvc();

【讨论】:

    猜你喜欢
    • 2019-04-17
    • 2018-10-07
    • 2021-01-28
    • 1970-01-01
    • 2019-01-21
    • 2017-08-20
    • 2019-02-22
    • 2021-01-06
    • 1970-01-01
    相关资源
    最近更新 更多