Аутентификация 2FA с помощью SMS

Rick Anderson

В этой статье я расскажу вам, как настроить двухфакторную аутентификацию (2FA) с помощью SMS. Здесь используется Twilio, но вы можете использовать любой другой SMS провайдер.

Создание новогоASP.NET Core проекта

Создайте новыйASP.NET Core проект с отдельными пользовательскими аккаунтами.

../../_images/new-project1.png

После создания проекта следуйте инструкциям в Подтверждение аккаунта и восстановление пароля, чтобы настроить SSL.

Настройка SMS для двухфакторной аутентификации с помощью Twilio

  • Создайте аккаунт Twilio.
  • Во вкладке Dashboard аккаунта Twilio обратите внимание на Account SID и Authentication token. Наберите Show API Credentials, чтобы просмотреть Authentication token.
  • Во вкладке Numbers обратите внимание на телефонный номер Twilio.
  • Установите NuGet пакет Twilio. Из Package Manager Console (PMC) введите следующую команду:
Install-Package Twilio
  • Добавьте код в файл Services/MessageServices.cs, чтобы включить SMS.
public class AuthMessageSender : IEmailSender, ISmsSender
{
    public AuthMessageSender(IOptions<AuthMessageSMSSenderOptions> optionsAccessor)
    {
        Options = optionsAccessor.Value;
    }

    public AuthMessageSMSSenderOptions Options { get; }  // set only via Secret Manager

    public Task SendEmailAsync(string email, string subject, string message)
    {
        // Plug in your email service here to send an email.
        return Task.FromResult(0);
    }

    public Task SendSmsAsync(string number, string message)
    {
        var twilio = new Twilio.TwilioRestClient(
            Options.SID,           // Account Sid from dashboard
            Options.AuthToken);    // Auth Token

        var result = twilio.SendMessage(Options.SendNumber, number, message);
        // Use the debug output for testing without receiving a SMS message.
        // Remove the Debug.WriteLine(message) line after debugging.
        // System.Diagnostics.Debug.WriteLine(message);
        return Task.FromResult(0);
    }
}

Примечание

Twilio пока еще не поддерживает .NET Core. Чтобы использовать Twilio, вам нужно работать с полной версией .NET Framework или вызвать Twilio REST API, чтобы отправлять SMS сообщения.

Примечание

Вы можете удалить комментарий // со строки System.Diagnostics.Debug.WriteLine(message); в этой строке тестируется приложение, если вы не можете получать SMS сообщения. Лучше всего использовать встроенное логирование.

Настройка имени/значения SMS провайдера

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

  • Создайте класс, соответствующий ключевому SMS ключу. Для данного примера у нас будет класс AuthMessageSMSSenderOptions в файле Services/AuthMessageSMSSenderOptions.cs.
public class AuthMessageSMSSenderOptions
{
    public string SID { get; set; }
    public string AuthToken { get; set; }
    public string SendNumber { get; set; }
}

Установите SID, AuthToken и SendNumber с помощью secret-manager tool. Например:

C:/WebSMS/src/WebApplication1>dotnet user-secrets set SID abcdefghi
info: Successfully saved SID = abcdefghi to the secret store.

Использование AuthMessageSMSSenderOptions

Добавьте AuthMessageSMSSenderOptions в контейнер сервисов в конце метода ConfigureServices класса Startup.cs:

    // Register application services.
    services.AddTransient<IEmailSender, AuthMessageSender>();
    services.AddTransient<ISmsSender, AuthMessageSender>();
    services.Configure<AuthMessageSMSSenderOptions>(Configuration);
}

Включение двухфакторной аутентификации

  • Откройте Razor файл Views/Manage/Index.cshtml.

  • Снимите комментарий с номера телефона, который начинается с:

    @*@(Model.PhoneNumber ?? "None")

  • Снимите комментарий с Model.TwoFactor, который начинается с:

    @*@if (Model.TwoFactor)

  • Закомментируйте или удалите <p>There are no two-factor authentication providers configured..

Весь код представлен ниже:

<dt>Phone Number:</dt>
<dd>
    <p>
        Phone Numbers can used as a second factor of verification in two-factor authentication.
        See <a href="http://go.microsoft.com/fwlink/?LinkID=532713">this article</a>
        for details on setting up this ASP.NET application to support two-factor authentication using SMS.
    </p>
    @(Model.PhoneNumber ?? "None") [
        @if (Model.PhoneNumber != null)
        {
            <a asp-controller="Manage" asp-action="AddPhoneNumber">Change</a>
                @: &nbsp;|&nbsp;
                <a asp-controller="Manage" asp-action="RemovePhoneNumber">Remove</a>
        }
        else
        {
            <a asp-controller="Manage" asp-action="AddPhoneNumber">Add</a>
        }
        ]
</dd>

<dt>Two-Factor Authentication:</dt>
<dd>
    @*<p>
        There are no two-factor authentication providers configured. See <a href="http://go.microsoft.com/fwlink/?LinkID=532713">this article</a>
        for setting up this application to support two-factor authentication.
    </p>*@
    @if (Model.TwoFactor)
        {
            <form asp-controller="Manage" asp-action="DisableTwoFactorAuthentication" method="post" class="form-horizontal" role="form">
                <text>
                    Enabled
                    <button type="submit" class="btn btn-link">Disable</button>
                </text>
            </form>
        }
        else
        {
            <form asp-controller="Manage" asp-action="EnableTwoFactorAuthentication" method="post" class="form-horizontal" role="form">
                <text>
                    Disabled
                    <button type="submit" class="btn btn-link">Enable</button>
                </text>
            </form>
        }
</dd>

Логин с помощью двухфакторной аутентификации

  • Запустите приложение и создайте нового пользователя
../../_images/login2fa1.png
  • Наберите имя пользователя, и это активирует метод действия Index в контроллере Manage. Затем выберите ссылку Add для номера телефона.
../../_images/login2fa2.png
  • Добавьте номер телефона, на который будет приходить верификационный код, и нажмите Send verification code.
../../_images/login2fa3.png
  • Вы получите текстовое сообщение с кодом верификации. Введите его и нажмите Submit
../../_images/login2fa4.png

Если вы не получили сообщение, см. Отладка Twilio.

  • В представлении Manage видно, что номер телефона был успешно добавлен.
../../_images/login2fa5.png
  • Нажмите Enable.
../../_images/login2fa6.png

Тестирование двухфакторной аутентификации

  • Выйдите.
  • Залогиньтесь.
  • Включается двухфакторная аутентификация, так что вам нужно предоставить второй фактор аутентификации. В данном примере мы использовали телефонную верификацию. В качестве второго фактора по умолчанию также может быть указан имейл. Вы можете выбрать и другие вторые факторы, например, QR коды. Нажмите Submit.
../../_images/login2fa7.png
  • Введите код, который вы получили в SMS.
  • Если вы поставите галочку на Remember this browser, то вам не нужно будет использовать 2FA, чтобы залогиниться с этого устройства и данного браузера. При включении 2FA и нажатии на Remember this browser вы будете хорошо защишены от злонамерных атак на ваш аккаунт. Это стоит делать на том устройстве, которое только вы регулярно используете.
../../_images/login2fa8.png

Локаут аккаунта для защиты против зловредных атак

Мы рекомендуем вам использовать локаут аккаунта. Если пользователь пытается залогиниться, сохраняется каждая неудачная попытка, и при достижении максимума этих попыток (по умолчанию 5) пользователь не может залогиниться в течение 5ти минут (время блокировки может быть настроена с помощью DefaultAccountLockoutTimeSpan). В данном примере блокировка составляет 10 при 10 неудачных попытках.

    services.Configure<IdentityOptions>(options =>
    {
        options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(10);
        options.Lockout.MaxFailedAccessAttempts = 10;
    });

    // Register application services.
    services.AddTransient<IEmailSender, AuthMessageSender>();
    services.AddTransient<ISmsSender, AuthMessageSender>();
    services.Configure<AuthMessageSMSSenderOptions>(Configuration);
}

Отладка Twilio

Если вы используете Twilio API, но не получаете SMS, попробуйте сделать следующее:

  1. Залогиньтесь на сайт Twilio и перейдите на страницу Logs > SMS & MMS Logs. Вы можете проверить, можно ли получать и отправлять сообщения.
  2. Для тестирования Twilio используйте данный код:
static void Main(string[] args)
{
        string AccountSid = "";
        string AuthToken = "";
        var twilio = new Twilio.TwilioRestClient(AccountSid, AuthToken);
        string FromPhone = "";
        string toPhone = "";
        var message = twilio.SendMessage(FromPhone, toPhone, "Twilio Test");
        Console.WriteLine(message.Sid);
}
Поделись хорошей новостью с друзьями!
Следи за новостями!