Ошибка неверного входа в систему при аутентификации на основе токенов Netsuite, когда включена двухфакторная аутентификация - PullRequest
1 голос
/ 04 апреля 2019

Мы пытались внедрить аутентификацию на основе токенов для нашей существующей интеграции с Netsuite, и новая реализация работает, как и ожидалось, для учетных записей Netsuite, где двухфакторная аутентификация не включена.

Из документации netsuite мы узнали, что включено несколько дополнительных функций для обслуживания учетной записи с двухфакторной аутентификацией.Согласно документу нам нужно сгенерировать OTP и отправить его вместе с заголовком авторизации.Для создания OTP netsuite рекомендуется перейти по этой ссылке .Мы реализовали c # эквивалент того же самого.Но при использовании сгенерированного OTP в заголовке авторизации мы получили Неправильная попытка входа в систему Ошибка.В журнале аудита входа в систему Netsuite написано " неправильный_секундатор ".Ниже приведена наша реализация

    public  string generateTOTP(string key,int returnDigits)
    {
        ulong T = new TOTP_SHA1(key).CounterNow();
        string time = T.ToString("X");
        string result = null;

        // Using the counter
        // First 8 bytes are for the movingFactor
        // Compliant with base RFC 4226 (HOTP)
        while (time.Length < 16)
            time = "0" + time;
        var hexString1 = ConvertStringToHex(key,Encoding.Default);
        byte[] msg = hexStr2Bytes(time);
        byte[] k = hexStr2Bytes(hexString1);


        byte[] hash = hmac_sha(k, msg);

        // put selected bytes into result int
        int offset = hash[hash.Length - 1] & 0xf;

        int binary =
            ((hash[offset] & 0x7f) << 24) |
            ((hash[offset + 1] & 0xff) << 16) |
            ((hash[offset + 2] & 0xff) << 8) |
            (hash[offset + 3] & 0xff);

        int otp = binary % DIGITS_POWER[returnDigits];

        result = Convert.ToString(otp);
        while (result.Length < returnDigits)
        {
            result = "0" + result;
        }
        return result;
    }

    private static int[] DIGITS_POWER { get; set; } = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000 };
    private byte[] K;
    public TOTP_SHA1(string tfasecretkey)
    {
        K = Encoding.ASCII.GetBytes(tfasecretkey);
    }

    public UInt64 CounterNow(int T1 = 30)
    {
        var secondsSinceEpoch = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds;
        return (UInt64)Math.Floor(secondsSinceEpoch / T1);
    }

    private static byte[] hexStr2Bytes(String hex)
    {
        return Enumerable.Range(0, hex.Length)
                 .Where(x => x % 2 == 0)
                 .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                 .ToArray();
    }

    private static byte[] hmac_sha(byte[] keyBytes,byte[] text)
    {
        var hmac = HMACSHA512.Create();
        hmac.Key = keyBytes;
        return hmac.ComputeHash(text);
    }

    public static string ConvertStringToHex(String input, System.Text.Encoding encoding)
    {
        Byte[] stringBytes = encoding.GetBytes(input);
        StringBuilder sbBytes = new StringBuilder(stringBytes.Length * 2);
        foreach (byte b in stringBytes)
        {
            sbBytes.AppendFormat("{0:X2}", b);
        }
        return sbBytes.ToString();
    }

Отзывы службы поддержки Netsuite относительно этой ошибки: сгенерированный OTP не соответствует требованиям.

Любая помощь будет принята с благодарностью.Заранее спасибо.

...