c# - 两因素谷歌身份验证与服务器上的代码不匹配 - ASP.Net MVC

标签 c# validation two-factor-authentication google-authenticator

我在使用谷歌身份验证器的双因素身份验证中使用以下代码。 此验证的问题在于,google 身份验证器代码在我的本地计算机上正确验证,但在服务器上未正确验证。 服务器时间设置为:(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;
        }
    }

最佳答案

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

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

关于c# - 两因素谷歌身份验证与服务器上的代码不匹配 - ASP.Net MVC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31078171/

相关文章:

c# - 我怎样才能避免 == null 检查?

c# - 套接字开始接收问题

ruby-on-rails - 一般如何本地化 ActiveRecord 消息?

html - 兼容性 html 文档

c# - 在 C# 中分析 GPU 使用情况

validation - 在客户端中删除输入时跳过验证器 - 这是否符合 JSF 规范?

asp.net-core - 如何在 ASP.NET Core Identity 中结合外部登录和双因素身份验证?

javascript - 如何将 Google Authenticator 添加到我的网站?

PhpStorm 和两因素身份验证

c# - 尝试在现有工作簿中选择命名的 Excel 2007 表并插入行