【问题标题】:How to properly refresh a token using JWT + HttpOnly Cookie?如何使用 JWT + HttpOnly Cookie 正确刷新令牌?
【发布时间】:2020-01-25 21:01:22
【问题描述】:

this 文档和this 主题的启发,我已经使用JWT + HttpOnly Cookies 在我的AspNetCore API 应用程序中成功设置了身份验证。

现在我正在尝试集成刷新令牌功能。 我找到了this 教程,但它仅基于 JWT 身份验证,我被困在应该向响应中添加 Token-Expired 标头的地方:

options.Events = new JwtBearerEvents
{
    OnAuthenticationFailed = context =>
    {
        if (context.Exception.GetType() == typeof(SecurityTokenExpiredException))
        {
            context.Response.Headers.Add("Token-Expired", "true");
        }
        return Task.CompletedTask;
    }
};

因为我使用的是基于 cookie 的身份验证,所以我使用 OnRedirectToLogin 事件而不是 OnAuthenticationFailed 事件,并且context.Exception.GetType() 方法对我不可用。 所以我不知道如何确定需要刷新令牌。

我该如何解决这个问题?

更新 1

这是我实际做的:

options.Events.OnRedirectToLogin = context =>
{
   if (context.Request.Path.StartsWithSegments("/api"))
      context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
   else
      context.Response.Redirect(context.RedirectUri);

   return Task.FromResult(0);
};

这里是我要添加 Token-Expired 标头的地方,但基于什么?

【问题讨论】:

  • Right.. 所以本质上你需要以某种方式不重定向到登录,而只需返回带有该标题的 401 结果?
  • 当没有提供访问令牌或它无效(我已经这样做)时,我必须返回没有任何特定标题的 401,如果访问令牌已过期,则返回 401 和 Token-Expired 标题,告诉客户端请求刷新令牌。

标签: c# authentication asp.net-core cookies jwt


【解决方案1】:

使用中间件将您的 cookie 添加到承载标头,如下所示:

        app.Use(async (context, next) =>
        {
            var token = context.Request.Cookies["access_token"];
            if (!string.IsNullOrEmpty(token)) context.Request.Headers.Add("Authorization", "Bearer " + token);
            await next();
        });

【讨论】:

    猜你喜欢
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 2016-08-25
    相关资源
    最近更新 更多