我有一个自定义类,当用户从服务器请求数据或任何内容时,我用它来使令牌失效Authorize但每当令牌过期时,原则仍然返回为 true,并且仍然调用控制器并获取数据。IsAuthenticated我希望它做的是使令牌失效并显式注销用户退出系统。我找不到任何有用的东西。如果需要,我可以提供JWT属性/过滤器的代码更新 1:令牌生成public static string GenerateToken(User user){ int expireMinutes; try { expireMinutes = string.IsNullOrEmpty(ConfigurationManager.AppSettings["SessionTimeInMinutes"]) ? 30 : int.Parse(ConfigurationManager.AppSettings["SessionTimeInMinutes"]); } catch (Exception) { expireMinutes = 30; } var symmetricKey = Convert.FromBase64String(Secret); var tokenHandler = new JwtSecurityTokenHandler(); var now = DateTime.Now; var tokenDescriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Email, user.Email) ,new Claim(ClaimTypes.Name, user.FirstName + " " + user.LastName) ,new Claim("uid", user.Id.ToString()) ,new Claim("cid", user.ClientId.ToString()) ,new Claim("rid", string.Join(",", user.Roles.Select(r => r.RoleId).ToList())) }), Expires = now.AddMinutes(Convert.ToInt32(expireMinutes)), IssuedAt = now, SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(symmetricKey), SecurityAlgorithms.HmacSha256Signature) }; var stoken = tokenHandler.CreateToken(tokenDescriptor); var token = tokenHandler.WriteToken(stoken); return token;}
2 回答

qq_遁去的一_1
TA贡献1725条经验 获得超8个赞
首先:JWT只是客户端可以操作的客户端令牌。这里没有绝对的安全。JWT 由符号键保护,但不能自行失效。有效令牌在过期之前一直有效。这是JWT的一个缺陷(正如@TimBiegeleisen在评论中指出的那样),令牌本身不能轻易失效。
如果用户工作太久并被自动注销,则您的JWT已过期,并且一切都很好。没有麻烦,因为它自然耗尽,你没有必要采取行动。
要使令牌失效,您需要使用 创建一个新令牌。这样,下次您下次检查JWT时,您看到它已过期。Expires = now.AddMinutes(-1)
用户即使在注销后也可以保存JWT并使用它的情况只能通过将JWT列入黑名单或偶尔维护某种其他类型的服务器端会话(这不起作用,即无状态Web服务)来实现。
编辑:删除了错误信息,并添加了使 JWT 失效(黑名单)的其他方法

千巷猫影
TA贡献1829条经验 获得超7个赞
您可以简单地兑现要撤销的令牌,然后使您的身份验证部分将已撤销的请求与现金中的令牌进行比较,并基于该请求拒绝该请求
在代币到期之前,现金应该知道代币的重新开采时间,并兑现那么长时间
- 2 回答
- 0 关注
- 159 浏览
添加回答
举报
0/150
提交
取消