Использование TotpSecurityStampBasedTokenProvider для TOTP с Google Authenticator
Я реализую 2FA с помощью TOTP на моем веб-сервисе asp.net web api 2 (НЕ.net core).
Реализация использует TotpSecurityStampBasedTokenProvider, который предоставляется платформой Microsoft.AspNet.Identity.
При рассмотрении требований Google Authenticator указывается, что секрет должен быть строкой в кодировке base32.
Если вы посмотрите на код из TotpSecurityStampBasedTokenProvider, он использует SecurityStamp пользователя в качестве секрета, который генерируется Identity Framework. Это GUID, а не строка в кодировке base32.
В соответствии со спецификациями для Google Authenticator существует требование, что секрет является строкой в кодировке base32.
Как я могу использовать TotpSecurityStampBasedTokenProvider для использования с Google Authenticator?
2 ответа
Проблема заключается в том, что TotpSecurityStampBasedTokenProvider, предоставленный Microsoft.AspNet.Identity.Core, реализует жестко заданный временной интервал в 3 минуты. Google Authenticator использует значение по умолчанию 30 секунд, которое НЕ может быть изменено в соответствии с предоставленной документацией.
Это приводит к тому, что оба TOTP-вычисления генерируют разные коды, что всегда приводит к ложной аутентификации.
Я добавил тикет в репозиторий github aspnet.identity по этому поводу.
Так что на данный момент мне ничего не остается, как создать свой собственный TotpProvider
TotpSecurityStampBasedTokenProvider использует UserManager.CreateSecurityTokenAsync для генерации секретного кода, который используется для вычисления токена.
Код опирается на идентификатор пользователя и генерируется в байтовом массиве, который обычно отображается на экране в виде кода base-32 или QR-кода пользователю на этапе настройки TOTP.
Короче говоря, не о чем беспокоиться.