如何使用JWT + HttpOnly Cookie正确刷新令牌?

时间:2019-09-25 15:53:15

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

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 标头,但是基于什么?

1 个答案:

答案 0 :(得分:0)

使用中间件,将您的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();
        });