IdentityDomainService.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. using Hotline.Share.Dtos.Identity;
  2. using Microsoft.Extensions.Logging;
  3. using XF.Domain.Cache;
  4. using XF.Domain.Dependency;
  5. namespace Hotline.Identity;
  6. public class IdentityDomainService : IIdentityDomainService, IScopeDependency
  7. {
  8. private readonly ITypedCache<AccountNonce> _cacheAccountNonce;
  9. private readonly ILogger<IdentityDomainService> _logger;
  10. public IdentityDomainService(
  11. ITypedCache<AccountNonce> cacheAccountNonce,
  12. ILogger<IdentityDomainService> logger)
  13. {
  14. _cacheAccountNonce = cacheAccountNonce;
  15. _logger = logger;
  16. }
  17. /// <summary>
  18. /// 校验用户是否真实
  19. /// </summary>
  20. /// <param name="request"></param>
  21. /// <returns></returns>
  22. public bool IsIdentityReal(LoginWithSignatureRequest request)
  23. {
  24. /*
  25. *时间戳timestamp与服务器时间戳相差不能超过60s大于服务器时间戳
  26. 随机数nonce60s内不能重复
  27. */
  28. if (string.IsNullOrEmpty(request.Nonce)) return false;
  29. var now = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
  30. _logger.LogInformation($"now:{now}, req:{request.Timestamp}");
  31. if (request.Timestamp > now) return false;
  32. if ((now - request.Timestamp) >= 60) return false;
  33. var nonce = _cacheAccountNonce.Get(request.Username)?.Nonce;
  34. _logger.LogInformation($"nonce:{nonce}, reqnonce:{request.Nonce}");
  35. if (!string.IsNullOrEmpty(nonce) && string.CompareOrdinal(nonce, request.Nonce) == 0) return false;
  36. return true;
  37. }
  38. /// <summary>
  39. /// 设置账户随机数
  40. /// </summary>
  41. /// <param name="username"></param>
  42. /// <param name="nonce"></param>
  43. public void SetAccountNonce(string username, string nonce)
  44. {
  45. _cacheAccountNonce.Set(username, new AccountNonce(nonce), TimeSpan.FromSeconds(60));
  46. }
  47. }