ASP.NET приложение MVC 5 с помощью SMS и электронной почты Two-Factor аутентификации
В этом руководстве показано, как создать веб-приложение ASP.NET MVC 5 с помощью проверки подлинности Two-Factor. Перед продолжением работы необходимо выполнить создать безопасное веб-приложение ASP.NET MVC 5 с помощью входа, подтверждения электронной почты и сброса пароля. Вы можете скачать готовое приложение здесь. Скачивание содержит вспомогательные средства отладки, которые позволяют тестировать подтверждение электронной почты и SMS без настройки поставщика электронной почты или SMS.
Это руководство было написано Риком Андерсоном ( Twitter: @RickAndMSFT ).
- Создание ASP.NET приложения MVC
- настройка SMS для двухфакторной проверки подлинности
- Включить двухфакторную проверку подлинности
- дополнительные ресурсы
Создание приложения ASP.NET MVC
Начните с установки и запуска Visual Studio Express 2013 для веб- или более поздней версии.
Заметка
Предупреждение. Перед продолжением работы необходимо выполнить создать безопасное веб-приложение ASP.NET MVC 5 с помощью входа, подтверждения электронной почты и сброса пароля. Чтобы завершить работу с этим руководством, необходимо установить Visual Studio 2013 с обновлением 3 или более поздней версии.
- Создайте новый веб-проект ASP.NET и выберите шаблон MVC. Веб-формы также поддерживают ASP.NET identity, поэтому вы можете выполнить аналогичные действия в приложении веб-форм.
- Оставьте проверку подлинности по умолчанию на отдельные учётные записи пользователей. Если вы хотите разместить приложение в Azure, установите флажок. Далее в руководстве мы развернем его в Azure. Вы можете открыть бесплатную учетную запись Azure.
- Задайте для проекта использование SSL-.
Настройка SMS для двухфакторной проверки подлинности
В этом руководстве приведены инструкции по использованию Twilio или ASPSMS, но вы можете использовать любой другой поставщик SMS.
Создание учетной записи пользователя с СМС-провайдером
установка дополнительных пакетов или добавление ссылок на службы
Twilio:
В консоли диспетчера пакетов введите следующую команду:
Install-Package Twilio
ASPSMS:
Необходимо добавить следующую ссылку на службу:Адрес:
https://webservice.aspsms.com/aspsmsx2.asmx?WSDL
Пространство имен:
ASPSMSX2
Определение пользовательских учетных данных поставщика 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).
реализация передачи данных поставщику 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 } }
Обновите представление 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") @: | @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>
Убедитесь, что методы действий
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"); }
Запустите приложение и войдите в систему с помощью учетной записи, ранее зарегистрированной.
Щелкните на ваш ID пользователя, что активирует метод действия
Index
в контроллереManage
.
Нажмите кнопку "Добавить".
Метод действия
AddPhoneNumber
отображает диалоговое окно для ввода номера телефона, который может получать SMS-сообщения.// GET: /Account/AddPhoneNumber public ActionResult AddPhoneNumber() { return View(); }
Через несколько секунд вы получите текстовое сообщение с кодом проверки. Введите его и нажмите клавишу Отправить.
В представлении "Управление" показано, что ваш номер телефона был добавлен.
Включение двухфакторной проверки подлинности
В созданном шаблоне приложении необходимо использовать пользовательский интерфейс для включения двухфакторной проверки подлинности (2FA). Чтобы включить 2FA, щелкните идентификатор пользователя (псевдоним электронной почты) на панели навигации.
Щелкните на включение 2FA.
Выход из системы, а затем снова войдите в систему. Если вы включили электронную почту (см. мой предыдущий урок), вы можете выбрать SMS или электронную почту для двухфакторной аутентификации.
Отображается страница "Проверить код", где можно ввести код (из SMS или электронной почты).
Щелкнув флажок Запомнить этот браузер, вы будете освобождены от необходимости использовать 2FA для входа при использовании браузера и устройства, где установлен флажок. Если вредоносные пользователи не могут получить доступ к устройству, включите 2FA и щелкните Помните, что этот браузер предоставит вам удобный доступ к паролю одного шага, сохраняя надежную защиту 2FA для всех доступа с ненадежных устройств. Это можно сделать на любом частном устройстве, которое вы регулярно используете.
В этом руководстве приведены краткие сведения о включении 2FA в новом приложении MVC ASP.NET. В моем руководстве двухфакторная проверка подлинности с помощью SMS и электронной почты с помощью ASP.NET Identity подробно описан код, приведенный в примере.
Дополнительные ресурсы
- Двухфакторная аутентификация с помощью SMS и электронной почты с ASP.NET Identity Подробно рассматривает двухфакторную аутентификацию
- Ссылки на рекомендуемые ресурсы ASP.NET Identity
- Подтверждение учетной записи и восстановление пароля с ASP.NET Identity Более подробное рассмотрение восстановления пароля и подтверждения учетной записи.
- приложение MVC 5 с входом через Facebook, Twitter, LinkedIn и Google OAuth2 В этом руководстве показано, как создать приложение ASP.NET MVC 5 с авторизацией через Facebook и Google OAuth2. В нем также показано, как добавить дополнительные данные в базу данных удостоверений.
- Разверните безопасное приложение ASP.NET MVC с поддержкой членства, OAuth и SQL базой данных на веб-платформе Azure. В этом руководстве добавлено развертывание Azure, показано, как защитить приложение с помощью ролей, как использовать API членства для добавления пользователей и ролей, а также другие функции безопасности.
- создание приложения Google для OAuth 2 и подключение приложения к проекту
- Создание приложения в Facebook и подключение приложения к проекту
- настройка SSL в проекте
- Настройка среды разработки C# и ASP.NET MVC