【发布时间】: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