双因素谷歌认证不匹配服务器上的代码-ASP.Net MVC

本文关键字:代码 -ASP Net MVC 服务器 谷歌 认证 不匹配 | 更新日期: 2023-09-27 18:00:10

我在使用谷歌验证器的双因素身份验证中使用以下代码。这个验证的问题是,谷歌验证器代码在我的本地机器上正确验证,但在服务器上没有。服务器时间设置为:(UTC-05:00)东部时间(美国和加拿大)我的系统时间设置为:(UTC-06:00)中部时间(美国和加拿大)

在服务器上,当我多次尝试点击验证按钮时,它有时会正确验证,有时不会。我不知道它为什么这么做。

任何人都可以帮我提出解决这个问题的想法/建议

 public static class TimeBasedOneTimePassword
    {
        public static readonly DateTime UNIX_EPOCH = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
        private static MemoryCache _cache;
        static TimeBasedOneTimePassword()
        {
          _cache = new MemoryCache("TimeBasedOneTimePassword");
        }
        public static string GetPassword(string secret)
        {
          return GetPassword(secret, GetCurrentCounter());
        }
        public static string GetPassword(string secret, DateTime epoch, int timeStep)
        {
          long counter = GetCurrentCounter(DateTime.UtcNow, epoch, timeStep);
          return GetPassword(secret, counter);
        }
        public static string GetPassword(string secret, DateTime now, DateTime epoch, int timeStep, int digits)
        {
          long counter = GetCurrentCounter(now, epoch, timeStep);
          return GetPassword(secret, counter, digits);
        }
        private static string GetPassword(string secret, long counter, int digits = 6)
        {
          return HashedOneTimePassword.GeneratePassword(secret, counter, digits);
        }
        private static long GetCurrentCounter()
        {
          return GetCurrentCounter(DateTime.UtcNow, UNIX_EPOCH, 30);
        }
        public static long GetCurrentRemaining()
        {
          return (long)(DateTime.UtcNow - UNIX_EPOCH).TotalSeconds % 30;
        }

        private static long GetCurrentCounter(DateTime now, DateTime epoch, int timeStep)
        {
          return (long)(now - epoch).TotalSeconds / timeStep;
        }
        public static bool IsValid(string secret, string password, int checkAdjacentIntervals = 1)
        {
          if (password == GetPassword(secret))
            return true;
          for (int i = 1; i <= checkAdjacentIntervals; i++)
          {
             if (password == GetPassword(secret, GetCurrentCounter() + i))
                return true;
             if (password == GetPassword(secret, GetCurrentCounter() - i))
                return true;
          }
          return false;
        }
    }

双因素谷歌认证不匹配服务器上的代码-ASP.Net MVC

我确实尝试将checkAdjacentIntervals设置为5,我能够验证谷歌验证器代码,但如前所述,它验证了过去的代码,这在我的情况下是不对的。

因此,我们通过使用NTP正确同步服务器来更正服务器的时间,然后它开始按预期工作。

我知道这是一个老问题,但它可能会帮助像我这样来寻找答案的人。谷歌身份验证是基于时间的。API将根据时间验证最近生成的代码(标记它,这是时间,而不是时区)。因此,如果系统的实际时间与生成代码的设备不同步,就会出现问题。尤其是当系统的时间落后于设备的时间时。如果您想验证我的答案,请尝试输入一些较旧的代码(基于系统和设备之间的连接间隙)。checkAdjacentIntervals在系统领先于设备时会对您有所帮助,但在系统落后时则不会。