Поделиться через


ASP.NET приложение MVC 5 с помощью SMS и электронной почты Two-Factor аутентификации

Рик Андерсон

В этом руководстве показано, как создать веб-приложение ASP.NET MVC 5 с помощью проверки подлинности Two-Factor. Перед продолжением работы необходимо выполнить создать безопасное веб-приложение ASP.NET MVC 5 с помощью входа, подтверждения электронной почты и сброса пароля. Вы можете скачать готовое приложение здесь. Скачивание содержит вспомогательные средства отладки, которые позволяют тестировать подтверждение электронной почты и SMS без настройки поставщика электронной почты или SMS.

Это руководство было написано Риком Андерсоном ( Twitter: @RickAndMSFT ).

Создание приложения ASP.NET MVC

Начните с установки и запуска Visual Studio Express 2013 для веб- или более поздней версии.

Заметка

Предупреждение. Перед продолжением работы необходимо выполнить создать безопасное веб-приложение ASP.NET MVC 5 с помощью входа, подтверждения электронной почты и сброса пароля. Чтобы завершить работу с этим руководством, необходимо установить Visual Studio 2013 с обновлением 3 или более поздней версии.

  1. Создайте новый веб-проект ASP.NET и выберите шаблон MVC. Веб-формы также поддерживают ASP.NET identity, поэтому вы можете выполнить аналогичные действия в приложении веб-форм.
    снимок экрана, на котором показано окно
  2. Оставьте проверку подлинности по умолчанию на отдельные учётные записи пользователей. Если вы хотите разместить приложение в Azure, установите флажок. Далее в руководстве мы развернем его в Azure. Вы можете открыть бесплатную учетную запись Azure.
  3. Задайте для проекта использование SSL-.

Настройка SMS для двухфакторной проверки подлинности

В этом руководстве приведены инструкции по использованию Twilio или ASPSMS, но вы можете использовать любой другой поставщик SMS.

  1. Создание учетной записи пользователя с СМС-провайдером

    Создайте учетную запись Twilio или ASPSMS.

  2. установка дополнительных пакетов или добавление ссылок на службы

    Twilio:
    В консоли диспетчера пакетов введите следующую команду:
    Install-Package Twilio

    ASPSMS:
    Необходимо добавить следующую ссылку на службу:

    снимок экрана, демонстрирующий окно

    Адрес:
    https://webservice.aspsms.com/aspsmsx2.asmx?WSDL

    Пространство имен:
    ASPSMSX2

  3. Определение пользовательских учетных данных поставщика SMS

Рекомендуется использовать самый безопасный вариант проверки подлинности. Сведения о приложениях .NET, развернутых в Azure, см. в статье:

Azure Key Vault и .NET Aspire обеспечивают наиболее безопасный способ хранения и получения секретов. Azure Key Vault — это облачная служба, которая защищает ключи шифрования и секреты, такие как сертификаты, строки подключения и пароли. Сведения о .NET Aspire см. в разделе Безопасное взаимодействие между размещением и интеграцией клиентов.

Избегайте предоставления удостоверений владельца ресурса с паролем, так как это:

  • Предоставляет клиенту пароль пользователя.
  • Значительный риск безопасности.
  • Следует использовать только в том случае, если другие потоки проверки подлинности недоступны.

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

Рекомендации по данным конфигурации:

  • Никогда не хранить пароли или другие конфиденциальные данные в коде поставщика конфигурации или в файлах конфигурации обычного текста.
  • Не используйте рабочие секреты в средах разработки или тестирования.
  • Укажите секреты вне проекта, чтобы они не могли быть случайно зафиксированы в репозитории исходного кода.

Twilio:
На вкладке панели мониторинга учетной записи Twilio скопируйте идентификатор безопасности учетной записи и маркер проверки подлинности.

ASPSMS:
В параметрах учетной записи перейдите к Userkey и скопируйте его вместе с самостоятельно определенным паролем.

Позже эти значения будут храниться в файле web.config в ключах "SMSAccountIdentification" и "SMSAccountPassword". 4. указание идентификатора отправителя или источника

Twilio:
На вкладке номера скопируйте номер телефона Twilio.

ASPSMS:
В меню разблокировки источников разблокируйте один или несколько источников или выберите буквенно-цифровой идентификатор источника (поддерживается не всеми сетями).

Позже мы будем сохранять это значение в файле web.config в ключе "SMSAccountFrom". 5. передача учетных данных провайдера SMS в приложение

Сделайте учетные данные и номер телефона отправителя доступными для приложения. Чтобы упростить задачу, мы сохраним эти значения в файле web.config. При развертывании в Azure можно безопасно хранить значения в параметрах приложения на вкладке настройки веб-сайта.

[!code-xml[Main](aspnet-mvc-5-app-with-sms-and-email-two-factor-authentication/samples/sample1.xml?highlight=8-10)]

> [!WARNING]
> Security - Never store sensitive data in your source code. The account and credentials are added to the code above to keep the sample simple. See [Best practices for deploying passwords and other sensitive data to ASP.NET and Azure](../../../identity/overview/features-api/best-practices-for-deploying-passwords-and-other-sensitive-data-to-aspnet-and-azure.md).
  1. реализация передачи данных поставщику SMS

    Настройте класс SmsService в файле App_Start\IdentityConfig.cs.

    В зависимости от используемого поставщика SMS активируйте либо раздел Twilio, либо раздел ASPSMS.

    public class SmsService : IIdentityMessageService
    {
        public Task SendAsync(IdentityMessage message)
        {
            // Twilio Begin
            //var accountSid = ConfigurationManager.AppSettings["SMSAccountIdentification"];
            //var authToken = ConfigurationManager.AppSettings["SMSAccountPassword"];
            //var fromNumber = ConfigurationManager.AppSettings["SMSAccountFrom"];
    
            //TwilioClient.Init(accountSid, authToken);
    
            //MessageResource result = MessageResource.Create(
                //new PhoneNumber(message.Destination),
                //from: new PhoneNumber(fromNumber),
               //body: message.Body
            //);
    
            ////Status is one of Queued, Sending, Sent, Failed or null if the number is not valid
             //Trace.TraceInformation(result.Status.ToString());
            ////Twilio doesn't currently have an async API, so return success.
             //return Task.FromResult(0);    
            // Twilio End
    
            // ASPSMS Begin 
            // var soapSms = new MvcPWx.ASPSMSX2.ASPSMSX2SoapClient("ASPSMSX2Soap");
            // soapSms.SendSimpleTextSMS(
            //   System.Configuration.ConfigurationManager.AppSettings["SMSAccountIdentification"],
            //   System.Configuration.ConfigurationManager.AppSettings["SMSAccountPassword"],
            //   message.Destination,
            //   System.Configuration.ConfigurationManager.AppSettings["SMSAccountFrom"],
            //   message.Body);
            // soapSms.Close();
            // return Task.FromResult(0);
            // ASPSMS End
        }
    }
    
  2. Обновите представление Views\Manage\Index.cshtml Razor: (примечание: Не просто удалите комментарии в существующем коде, используйте приведенный ниже код).

    @model MvcPWy.Models.IndexViewModel
    @{
       ViewBag.Title = "Manage";
    }
    <h2>@ViewBag.Title.</h2>
    <p class="text-success">@ViewBag.StatusMessage</p>
    <div>
       <h4>Change your account settings</h4>
       <hr />
       <dl class="dl-horizontal">
          <dt>Password:</dt>
          <dd>
             [
             @if (Model.HasPassword)
             {
                @Html.ActionLink("Change your password", "ChangePassword")
             }
             else
             {
                @Html.ActionLink("Create", "SetPassword")
             }
             ]
          </dd>
          <dt>External Logins:</dt>
          <dd>
             @Model.Logins.Count [
             @Html.ActionLink("Manage", "ManageLogins") ]
          </dd>
            <dt>Phone Number:</dt>
          <dd>
             @(Model.PhoneNumber ?? "None") [
             @if (Model.PhoneNumber != null)
             {
                @Html.ActionLink("Change", "AddPhoneNumber")
                @: &nbsp;|&nbsp;
                @Html.ActionLink("Remove", "RemovePhoneNumber")
             }
             else
             {
                @Html.ActionLink("Add", "AddPhoneNumber")
             }
             ]
          </dd>
          <dt>Two-Factor Authentication:</dt> 
          <dd>
             @if (Model.TwoFactor)
             {
                using (Html.BeginForm("DisableTwoFactorAuthentication", "Manage", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
                {
                   @Html.AntiForgeryToken()
                   <text>Enabled
                      <input type="submit" value="Disable" class="btn btn-link" />
                   </text>
                }
             }
             else
             {
                using (Html.BeginForm("EnableTwoFactorAuthentication", "Manage", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
                {
                   @Html.AntiForgeryToken()
                   <text>Disabled
                      <input type="submit" value="Enable" class="btn btn-link" />
                   </text>
                }
             }
          </dd>
       </dl>
    </div>
    
  3. Убедитесь, что методы действий EnableTwoFactorAuthentication и DisableTwoFactorAuthentication в ManageController имеют атрибут [ValidateAntiForgeryToken].

    //
    // POST: /Manage/EnableTwoFactorAuthentication
    [HttpPost,ValidateAntiForgeryToken]
    public async Task<ActionResult> EnableTwoFactorAuthentication()
    {
        await UserManager.SetTwoFactorEnabledAsync(User.Identity.GetUserId(), true);
        var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
        if (user != null)
        {
            await SignInAsync(user, isPersistent: false);
        }
        return RedirectToAction("Index", "Manage");
    }
    //
    // POST: /Manage/DisableTwoFactorAuthentication
    [HttpPost, ValidateAntiForgeryToken]
    public async Task<ActionResult> DisableTwoFactorAuthentication()
    {
        await UserManager.SetTwoFactorEnabledAsync(User.Identity.GetUserId(), false);
        var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
        if (user != null)
        {
            await SignInAsync(user, isPersistent: false);
        }
        return RedirectToAction("Index", "Manage");
    }
    
  4. Запустите приложение и войдите в систему с помощью учетной записи, ранее зарегистрированной.

  5. Щелкните на ваш ID пользователя, что активирует метод действия Index в контроллере Manage.
    снимок экрана, на котором показана домашняя страница приложения ASP.NET. Выделен пример идентификатора пользователя.

  6. Нажмите кнопку "Добавить".
    снимок экрана, на котором показана страница параметров учетной записи приложения S P dot NET. Не выделен раздел

  7. Метод действия AddPhoneNumber отображает диалоговое окно для ввода номера телефона, который может получать SMS-сообщения.

    // GET: /Account/AddPhoneNumber
    public ActionResult AddPhoneNumber()
    {
       return View();
    }
    

    снимок экрана, на котором показана страница

  8. Через несколько секунд вы получите текстовое сообщение с кодом проверки. Введите его и нажмите клавишу Отправить.
    снимок экрана страницы добавления номера телефона в приложении A S P dot NET с полем ввода, заполненным примером кода подтверждения, и кнопкой

  9. В представлении "Управление" показано, что ваш номер телефона был добавлен.

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

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

снимок экрана, на котором отображается домашняя страница приложения A S P dot NET. Выделен пример идентификатора пользователя.

Щелкните на включение 2FA.

Скриншот, на котором показана страница настройки учетной записи приложения ASP.NET. Two-Factor Аутентификация: отключена, выделен раздел со ссылкой для включения.

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

снимок экрана, на котором показана страница приложения ASP.NET для отправки кода подтверждения. В раскрывающемся меню отображены варианты для кода телефона и кода электронной почты.

Отображается страница "Проверить код", где можно ввести код (из SMS или электронной почты).

снимок экрана, на котором показана страница проверки приложения ASP.NET для двухфакторной аутентификации. Под примером кода выделен флажок с параметром

Щелкнув флажок Запомнить этот браузер, вы будете освобождены от необходимости использовать 2FA для входа при использовании браузера и устройства, где установлен флажок. Если вредоносные пользователи не могут получить доступ к устройству, включите 2FA и щелкните Помните, что этот браузер предоставит вам удобный доступ к паролю одного шага, сохраняя надежную защиту 2FA для всех доступа с ненадежных устройств. Это можно сделать на любом частном устройстве, которое вы регулярно используете.

В этом руководстве приведены краткие сведения о включении 2FA в новом приложении MVC ASP.NET. В моем руководстве двухфакторная проверка подлинности с помощью SMS и электронной почты с помощью ASP.NET Identity подробно описан код, приведенный в примере.

Дополнительные ресурсы