受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 标头,但是基于什么?
答案 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();
});