refactor(auth): 优化JWT认证和Token刷新逻辑
1. 调整JWT令牌过期时间配置,新增JwtTokenExpiryDays配置项 2. 分离Token存储前缀,区分管理后台和微信端Token 3. 新增Redis Token有效性校验逻辑,拦截无效/已注销的Token 4. 简化自动刷新逻辑,改为每次请求刷新Redis Token过期时间 5. 完善相关注释和代码结构
This commit is contained in:
@ -9,6 +9,7 @@ using Microsoft.Extensions.Options;
|
||||
using Microsoft.IdentityModel.Tokens;
|
||||
using QYZH.InteractiveMagazine.Infrastructure.Middleware;
|
||||
using QYZH.InteractiveMagazine.Models.Settings;
|
||||
using System.Security.Claims;
|
||||
using System.Text;
|
||||
using System.Text.Encodings.Web;
|
||||
|
||||
@ -68,6 +69,36 @@ public static class DependencyInjectionExtensions
|
||||
ValidateLifetime = true,
|
||||
ClockSkew = TimeSpan.Zero
|
||||
};
|
||||
|
||||
options.Events = new JwtBearerEvents
|
||||
{
|
||||
OnTokenValidated = async context =>
|
||||
{
|
||||
var userId = context.Principal?.FindFirst(ClaimTypes.NameIdentifier)?.Value;
|
||||
if (string.IsNullOrEmpty(userId))
|
||||
{
|
||||
context.Fail("无效的 Token");
|
||||
return;
|
||||
}
|
||||
|
||||
// 检查管理后台 Token
|
||||
var adminToken = await RedisHelper.GetAsync($"InteractiveMagazine:AdminAuth:Token:{userId}");
|
||||
if (!string.IsNullOrEmpty(adminToken))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// 检查微信端 Token
|
||||
var wechatToken = await RedisHelper.GetAsync($"InteractiveMagazine:WeChatAuth:Token:{userId}");
|
||||
if (!string.IsNullOrEmpty(wechatToken))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Redis 中不存在任何 Token,认证失败
|
||||
context.Fail("Token 已失效,请重新登录");
|
||||
}
|
||||
};
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user