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


Создание веб-приложения на Web Forms ASP.NET с аутентификацией через SMS Two-Factor (C#)

Эрик Рейтан

В этом руководстве показано, как создать приложение веб-форм ASP.NET с помощью проверки подлинности Two-Factor. Это руководство было разработано для дополнения учебника Создание безопасного приложения веб-форм ASP.NET с регистрацией пользователей, подтверждением электронной почты и сбросом пароля. Кроме того, это руководство было основано на учебнике Рика Андерсона по MVC .

Знакомство

В этом руководстве описаны действия, необходимые для создания приложения веб-форм ASP.NET, которое поддерживает проверку подлинности Two-Factor с помощью Visual Studio. Two-Factor проверка подлинности — это дополнительный шаг проверки подлинности пользователя. Этот дополнительный шаг создает уникальный личный идентификационный номер (ПИН-код) во время входа. ПИН-код обычно отправляется пользователю в виде сообщения электронной почты или SMS. Затем пользователь приложения вводит ПИН-код в качестве дополнительной меры проверки подлинности при входе.

Задачи и сведения руководства:

Создание приложения веб-форм ASP.NET

Начните с установки и запуска Visual Studio Express 2013 для веб или Visual Studio 2013. Установите также Visual Studio 2013 Update 3 или более поздние версии. Кроме того, необходимо создать учетную запись Twilio, как описано ниже.

Заметка

Важно: Чтобы завершить работу с этим руководством, необходимо установить Visual Studio 2013 Update 3 или более поздней версии.

  1. Создайте проект (файлновый проект) и выберите шаблон веб-приложения ASP.NET вместе с шаблоном .NET Framework версии 4.5.2 в диалоговом окне "Новый проект".
  2. В диалоговом окне New ASP.NET Project выберите шаблон Web Forms. Оставьте аутентификацию по умолчанию как отдельные учетные записи пользователей. Затем нажмите кнопку ОК, чтобы создать проект.
    снимок экрана диалогового окна
  3. Включите SSL для проекта. Выполните действия, доступные в разделе "Включить SSL для проекта" учебной серии "Начало работы с веб-формами".
  4. В Visual Studio откройте консоль диспетчера пакетов (средства —>Диспетчер пакетов NuGet —>консоль диспетчера пакетов) и введите следующую команду:
    Install-Package Twilio

Настройка SMS и Two-Factor аутентификации

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

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

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

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

  4. Сделайтеидентификатора безопасности учетной записи Twi lio, маркер проверки подлинности и номер телефона для приложения. Чтобы упростить задачу, вы будете хранить эти значения в файле web.config. При развертывании в Azure можно безопасно хранить значения в разделе appSettings на вкладке настройки веб-сайта. Кроме того, при добавлении номера телефона используйте только номера.
    Обратите внимание, что вы также можете добавить учетные данные SendGrid. SendGrid — это служба уведомлений по электронной почте. Дополнительные сведения о том, как включить SendGrid, см. в разделе "Подключение SendGrid" руководства под названием Создание защищенного приложения ASP.NET Web Forms с регистрацией пользователей, подтверждением электронной почты и сбросом пароля.

    </connectionStrings>
      <appSettings>
        <!-- SendGrid Credentials-->    
        <add key="emailServiceUserName" value="[EmailServiceAccountUserName]" />
        <add key="emailServicePassword" value="[EmailServiceAccountPassword]" />
        <!-- Twilio Credentials-->
        <add key="SMSSID" value="[SMSServiceAccountSID]" />
        <add key="SMSAuthToken" value="[SMSServiceAuthorizationToken]" />
        <add key="SMSPhoneNumber" value="+[SMSPhoneNumber]" />    
      </appSettings>
      <system.web>
    

    Предупреждение

    Безопасность— никогда не храните конфиденциальные данные в исходном коде. В этом примере учетная запись и учетные данные хранятся в разделе appSettings файла Web.config. В Azure вы можете безопасно хранить эти значения на вкладке Настройка на портале Azure. Дополнительные сведения см. в статье Рика Андерсона под названием лучшие практики по развертыванию паролей и других конфиденциальных данных для ASP.NET и Azure.

  5. Настройте класс SmsService в файле App_Start\IdentityConfig.cs, выполнив следующие изменения, выделенные желтым цветом:

    public class SmsService : IIdentityMessageService
    {
        public Task SendAsync(IdentityMessage message)
        {
            var Twilio = new TwilioRestClient(
               ConfigurationManager.AppSettings["SMSSID"],
               ConfigurationManager.AppSettings["SMSAuthToken"]
            );
            var result = Twilio.SendMessage(
                ConfigurationManager.AppSettings["SMSPhoneNumber"],
               message.Destination, message.Body);
    
            // Status is one of Queued, Sending, Sent, Failed or null if the number is not valid
            Trace.TraceInformation(result.Status);
    
            // Twilio doesn't currently have an async API, so return success.
            return Task.FromResult(0);
        }
    }
    
  6. Добавьте следующие инструкции using в начало файла IdentityConfig.cs:

    using Twilio;
    using System.Net;
    using System.Configuration;
    using System.Diagnostics;
    
  7. Обновите файл account/Manage.aspx, удалив строки, выделенные желтым цветом:

    <%@ Page Title="Manage Account" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Manage.aspx.cs" Inherits="WebFormsTwoFactor.Account.Manage" %>
    
    <%@ Register Src="~/Account/OpenAuthProviders.ascx" TagPrefix="uc" TagName="OpenAuthProviders" %>
    
    <asp:Content ContentPlaceHolderID="MainContent" runat="server">
        <h2><%: Title %>.</h2>
    
        <div>
            <asp:PlaceHolder runat="server" ID="successMessage" Visible="false" ViewStateMode="Disabled">
                <p class="text-success"><%: SuccessMessage %></p>
            </asp:PlaceHolder>
        </div>
    
        <div class="row">
            <div class="col-md-12">
                <div class="form-horizontal">
                    <h4>Change your account settings</h4>
                    <hr />
                    <dl class="dl-horizontal">
                        <dt>Password:</dt>
                        <dd>
                            <asp:HyperLink NavigateUrl="/Account/ManagePassword" Text="[Change]" Visible="false" ID="ChangePassword" runat="server" />
                            <asp:HyperLink NavigateUrl="/Account/ManagePassword" Text="[Create]" Visible="false" ID="CreatePassword" runat="server" />
                        </dd>
                        <dt>External Logins:</dt>
                        <dd><%: LoginsCount %>
                            <asp:HyperLink NavigateUrl="/Account/ManageLogins" Text="[Manage]" runat="server" />
    
                        </dd>
                        <%--
                            Phone Numbers can used as a second factor of verification in a two-factor authentication system.
                            See <a href="https://go.microsoft.com/fwlink/?LinkId=313242">this article</a>
                            for details on setting up this ASP.NET application to support two-factor authentication using SMS.
                            Uncomment the following block after you have set up two-factor authentication
                        --%>
    
                        <dt>Phone Number:</dt>
                        <%--
                        <% if (HasPhoneNumber)
                           { %>
                        <dd>
                            <asp:HyperLink NavigateUrl="/Account/AddPhoneNumber" runat="server" Text="[Add]" />
                        </dd>
                        <% }
                           else
                           { %>
                        <dd>
                            <asp:Label Text="" ID="PhoneNumber" runat="server" />
                            <asp:HyperLink NavigateUrl="/Account/AddPhoneNumber" runat="server" Text="[Change]" /> &nbsp;|&nbsp;
                            <asp:LinkButton Text="[Remove]" OnClick="RemovePhone_Click" runat="server" />
                        </dd>
                        <% } %>
                        --%>
    
                        <dt>Two-Factor Authentication:</dt>
                        <dd>
                            <p>
                                There are no two-factor authentication providers configured. See <a href="https://go.microsoft.com/fwlink/?LinkId=313242">this article</a>
                                for details on setting up this ASP.NET application to support two-factor authentication.
                            </p>
                            <% if (TwoFactorEnabled)
                              { %> 
                            <%--
                            Enabled
                            <asp:LinkButton Text="[Disable]" runat="server" CommandArgument="false" OnClick="TwoFactorDisable_Click" />
                            --%>
                            <% }
                              else
                              { %> 
                            <%--
                            Disabled
                            <asp:LinkButton Text="[Enable]" CommandArgument="true" OnClick="TwoFactorEnable_Click" runat="server" />
                            --%>
                            <% } %>
                        </dd>
                    </dl>
                </div>
            </div>
        </div>
    </asp:Content>
    
  8. В обработчике Page_Load кода Manage.aspx.cs раскомментируйте строку кода, выделенную желтым цветом, чтобы она отображалась следующим образом:

    protected void Page_Load()
    {
        var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
    
        HasPhoneNumber = String.IsNullOrEmpty(manager.GetPhoneNumber(User.Identity.GetUserId()));
    
        // Enable this after setting up two-factor authentientication
        PhoneNumber.Text = manager.GetPhoneNumber(User.Identity.GetUserId()) ?? String.Empty;
    
        TwoFactorEnabled = manager.GetTwoFactorEnabled(User.Identity.GetUserId());
    
        LoginsCount = manager.GetLogins(User.Identity.GetUserId()).Count;
    
        var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
    
        if (!IsPostBack)
        {
            // Determine the sections to render
            if (HasPassword(manager))
            {
                ChangePassword.Visible = true;
            }
            else
            {
                CreatePassword.Visible = true;
                ChangePassword.Visible = false;
            }
    
            // Render success message
            var message = Request.QueryString["m"];
            if (message != null)
            {
                // Strip the query string from action
                Form.Action = ResolveUrl("~/Account/Manage");
    
                SuccessMessage =
                    message == "ChangePwdSuccess" ? "Your password has been changed."
                    : message == "SetPwdSuccess" ? "Your password has been set."
                    : message == "RemoveLoginSuccess" ? "The account was removed."
                    : message == "AddPhoneNumberSuccess" ? "Phone number has been added"
                    : message == "RemovePhoneNumberSuccess" ? "Phone number was removed"
                    : String.Empty;
                successMessage.Visible = !String.IsNullOrEmpty(SuccessMessage);
            }
        }
    }
    
  9. В коде, относящемся к аккаунтуTwoFactorAuthenticationSignIn.aspx.cs, обновите обработчик , добавив следующий код, выделенный желтым цветом:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            var userId = signinManager.GetVerifiedUserId<ApplicationUser, string>();
            if (userId == null)
            {
                Response.Redirect("/Account/Error", true);
            }
            var userFactors = manager.GetValidTwoFactorProviders(userId);
            Providers.DataSource = userFactors.Select(x => x).ToList();
            Providers.DataBind();
        }
    }
    

    Изменив приведенный выше код, выпадающий список "Поставщики", содержащий параметры проверки подлинности, не будет переключаться на первое значение. Это позволит пользователю успешно выбрать все параметры, которые будут использоваться при проверке подлинности, а не только в первую очередь.

  10. В Обозревателе решений щелкните правой кнопкой мыши Default.aspx и выберите Установить как начальную страницу.

  11. При тестировании вашего приложения сначала соберите приложение (Ctrl+Shift+B), затем запустите приложение (F5), и выберите "Зарегистрировать", чтобы создать новую учетную запись пользователя, или выберите "Войти", если учетная запись пользователя уже зарегистрирована.

  12. После того как вы вошли в систему, нажмите идентификатор пользователя (адрес электронной почты) на панели навигации, чтобы отобразить страницу "Управление учетной записью" (Manage.aspx).
    Скриншот окна браузера ответа ASP.NET с идентификатором пользователя, выделенным красным прямоугольником.

  13. Щелкните Добавить рядом с номер телефона на странице "Управление учетной записью".
    снимок экрана: окно браузера

  14. Добавьте номер телефона, где вы (как пользователь) хотите получать SMS-сообщения (текстовые сообщения) и нажмите кнопку Отправить.
    снимок экрана: окно браузера
    На этом этапе приложение будет использовать учетные данные из Web.config для связи с Twilio. SMS-сообщение (текстовое сообщение) будет отправлено на телефон, связанный с учетной записью пользователя. Вы можете убедиться, что сообщение Twilio отправлено, просмотрев панель мониторинга Twilio.

  15. Через несколько секунд телефон, связанный с учетной записью пользователя, получит текстовое сообщение, содержащее код проверки. Введите код проверки и нажмите клавишу Отправить.
    снимок экрана: окно браузера

Включение проверки подлинности Two-Factor для зарегистрированного пользователя

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

  1. В качестве пользователя приложения можно включить двухфакторную проверку подлинности для конкретной учетной записи, щелкнув идентификатор пользователя (псевдоним электронной почты) на панели навигации, чтобы отобразить страницу Управление учетной записью. Затем щелкните ссылку Включить, чтобы включить двухфакторную проверку подлинности для учетной записи.снимок экрана: окно браузера
  2. Выйдите из системы, а затем войдите обратно. Если вы включили электронную почту, можно выбрать SMS или электронную почту для двухфакторной проверки подлинности. Если вы еще не включили электронную почту, ознакомьтесь с руководством создание приложения для безопасных ASP.NET веб-форм с помощью регистрации пользователей, подтверждения электронной почты и сброса пароля.снимок экрана: окно браузера проверки подлинности Two-Factor с раскрывающимся списком
  3. Страница проверки подлинности Two-Factor отображается, где можно ввести код (из SMS или электронной почты).снимок экрана: окно браузера проверки подлинности Two-Factor с полем
    Установив флажок Помните этот браузер, вы избавитесь от необходимости использовать двухфакторную аутентификацию при входе в систему с браузера и устройства, где установлен этот флажок. Если вредоносные пользователи не могут получить доступ к устройству, включите двухфакторную проверку подлинности и щелкните Помните, что этот браузер обеспечит удобный доступ к паролям одного шага, сохраняя надежную двухфакторную защиту проверки подлинности для всех доступа с ненадежных устройств. Это можно сделать на любом частном устройстве, которое вы регулярно используете.

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