BlackListJwtSecurityTokenHandler.cs 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. using Microsoft.IdentityModel.Tokens;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IdentityModel.Tokens.Jwt;
  5. using System.Linq;
  6. using System.Security.Claims;
  7. using System.Threading.Tasks;
  8. using TEAMModelOS.SDK.Context.Exception;
  9. using TEAMModelOS.SDK.Helper.Security.ShaHash;
  10. namespace HiTeachCE.Extension
  11. {
  12. public class BlackListJwtSecurityTokenHandler : JwtSecurityTokenHandler
  13. {
  14. public BlackListJwtSecurityTokenHandler( )
  15. {
  16. }
  17. public override ClaimsPrincipal ValidateToken(string token, TokenValidationParameters validationParameters,
  18. out SecurityToken validatedToken)
  19. {
  20. var claimsPrincipal = base.ValidateToken(token, validationParameters, out validatedToken);
  21. //解析ClaimsPrincipal取出UserId、Iat和Jti
  22. //具体的验证步骤有两个:
  23. //- 到Redis查找该用户的Token失效时间,如果当前Token的颁发时间在此之前就是无效的;
  24. //- 到Redis的黑名单里判断是否存在该Token;
  25. //通过Redis验证Token
  26. string sha = ShaHashHelper.GetSHA1(token);
  27. if (RedisHelper.Exists("jwt:"+sha))
  28. {
  29. throw new BizException("登录失效!",401);
  30. }
  31. return claimsPrincipal;
  32. }
  33. }
  34. }