ValidJtiHandler.cs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. using Microsoft.AspNetCore.Authorization;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using TEAMModelOS.SDK.Extension.JwtAuth.Models;
  7. using TEAMModelOS.SDK.Module.AzureTable.Interfaces;
  8. namespace TEAMModelOS.SDK.Extension.JwtAuth.Requirements
  9. {
  10. public class ValidJtiHandler : AuthorizationHandler<ValidJtiRequirement>
  11. {
  12. private IAzureTableDBRepository _azureTableDBRepository;
  13. public ValidJtiHandler(IAzureTableDBRepository azureTableDBRepository)
  14. {
  15. _azureTableDBRepository = azureTableDBRepository;
  16. }
  17. protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, ValidJtiRequirement requirement)
  18. {
  19. // 检查 Jti 是否存在
  20. var jti = context.User.FindFirst("jti")?.Value;
  21. if (jti == null)
  22. {
  23. context.Fail(); // 显式的声明验证失败
  24. return Task.CompletedTask;
  25. }
  26. // 检查 jti 是否在黑名单
  27. // 使用Redis 对于连续访问的token 进行限制
  28. JwtBlackRecord record = _azureTableDBRepository.FindOneByKey<JwtBlackRecord>("Jti",jti).Result;
  29. if (record != null && !string.IsNullOrEmpty(record.RowKey))
  30. {
  31. context.Fail();
  32. }
  33. else
  34. {
  35. context.Succeed(requirement); // 显式的声明验证成功
  36. }
  37. return Task.CompletedTask;
  38. }
  39. }
  40. }