Sdílet prostřednictvím


ASP.NET MVC 5 aplikace s ověřováním SMS a e-mail Two-Factor

podle Rick Anderson

V tomto kurzu se dozvíte, jak vytvořit webovou aplikaci ASP.NET MVC 5 s ověřováním Two-Factor. Než budete pokračovat, měli byste dokončit Vytvoření zabezpečené webové aplikace ASP.NET MVC 5 s přihlášením, potvrzením e-mailu a reset ováním hesla. Dokončenou aplikaci si můžete stáhnout zde. Stahování obsahuje ladicí nástroje, které umožňují testovat potvrzení e-mailu a SMS bez nastavení poskytovatele e-mailu nebo SMS.

Tento kurz napsal Rick Anderson ( Twitter: @RickAndMSFT ).

Vytvoření aplikace ASP.NET MVC

Začněte instalací a spuštěním Visual Studio Express 2013 pro web nebo novější.

Poznámka

Upozornění: Než budete pokračovat, měli byste dokončit Vytvoření zabezpečené webové aplikace ASP.NET MVC 5 s přihlášením, potvrzením e-mailu a reset ováním hesla. K dokončení tohoto kurzu je nutné nainstalovat Visual Studio 2013 Update 3 nebo novější.

  1. Vytvořte nový webový projekt ASP.NET a vyberte šablonu MVC. Webové formuláře také podporují ASP.NET Identity, takže můžete postupovat podobně v aplikaci webových formulářů.
    Snímek obrazovky, který zobrazuje okno Nový projekt ASP.NET. Je označené výchozí ověřování, jednotlivé uživatelské účty.
  2. Ponechte výchozí ověřování jako individuálního uživatelského účtu. Pokud chcete aplikaci hostovat v Azure, nechte toto políčko zaškrtnuté. Později v tomto kurzu nasadíme do Azure. Můžete zdarma otevřít účet Azure.
  3. Nastavte projekt tak, aby používal protokol SSL.

Nastavení sms pro dvoufaktorové ověřování

Tento kurz obsahuje pokyny pro použití Twilio nebo ASPSMS, ale můžete použít libovolného jiného poskytovatele serveru SMS.

  1. Vytvoření uživatelského účtu u poskytovatele serveru SMS

    Vytvořte účet Twilio nebo účet ASPSMS.

  2. Instalace dalších balíčků nebo přidání odkazů na služby

    Twilio:
    V konzole Správce balíčků zadejte následující příkaz:
    Install-Package Twilio

    ASPSMS:
    Je potřeba přidat následující odkaz na službu:

    Snímek obrazovky, který zobrazuje okno „Přidat odkaz na službu“. Zvýrazněné jsou vstupní pole Adresa a Obor názvů.

    Adresa:
    https://webservice.aspsms.com/aspsmsx2.asmx?WSDL

    Namespace:
    ASPSMSX2

  3. zjištění přihlašovacích údajů uživatele poskytovatele serveru SMS

Doporučujeme použít nejbezpečnější zabezpečenou možnost ověřování. Informace o aplikacích .NET nasazených do Azure najdete tady:

Azure Key Vault a .NET Aspire poskytují nejbezpečnější způsob ukládání a načítání tajných kódů. Azure Key Vault je cloudová služba, která chrání šifrovací klíče a tajné kódy, jako jsou certifikáty, připojovací řetězce a hesla. Informace o rozhraní .NET Aspire najdete v tématu Zabezpečená komunikace mezi hostování a integracemi klientů.

Vyhněte se použití metody Resource Owner Password Credentials Grant, protože:

  • Zpřístupní heslo uživatele klientovi.
  • Jedná se o významné bezpečnostní riziko.
  • Mělo by se použít jenom v případě, že jiné toky ověřování nejsou možné.

Když je aplikace nasazená na testovací server, můžete proměnnou prostředí použít k nastavení připojovacího řetězce na testovací databázový server. Proměnné prostředí jsou obecně uložené ve formátu prostého a nešifrovaného textu. Pokud dojde k ohrožení zabezpečení počítače nebo procesu, můžou k proměnným prostředí přistupovat nedůvěryhodné strany. Nedoporučujeme používat proměnné prostředí k uložení produkčního připojovacího řetězce, protože to není nejbezpečnější přístup.

Pokyny pro konfigurační data:

  • Nikdy neukládejte hesla ani jiná citlivá data v kódu zprostředkovatele konfigurace nebo v konfiguračních souborech prostého textu.
  • Nepoužívejte produkční tajné kódy ve vývojových nebo testovacích prostředích.
  • Zadejte tajemství mimo rámec projektu, aby nemohly být omylem potvrzeny do úložiště zdrojového kódu.

Twilio:
Na kartě řídicího panelu účtu Twilio zkopírujte SID účtu a autorizační token.

ASPSMS:
V nastavení účtu přejděte na Userkey a zkopírujte ho společně s vlastním Password.

Později tyto hodnoty uložíme do souboru web.config v klíčích "SMSAccountIdentification" a "SMSAccountPassword" . 4. Určení ID odesílatele / původce

Twilio:
Na záložce Čísla zkopírujte svoje telefonní číslo Twilio.

ASPSMS:
V nabídce Odemknout originátory odemkněte jednoho nebo více originátorů nebo zvolte alfanumerického originátora (není podporováno ve všech sítích).

Později tuto hodnotu uložíme do souboru web.config v klíči "SMSAccountFrom" . 5. Převod přihlašovacích údajů poskytovatele serveru SMS do aplikace

Zpřístupnění přihlašovacích údajů a telefonního čísla odesílatele pro aplikaci Abychom měli všechno jednoduché, uložíme tyto hodnoty do souboru web.config. Když nasadíme do Azure, můžeme hodnoty bezpečně uložit v části nastavení aplikace na kartě Konfigurace webu.

[!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. Implementace přenosu dat do poskytovatele serveru SMS

    Nakonfigurujte třídu SmsService v souboru App_Start\IdentityConfig.cs.

    V závislosti na použitém poskytovateli SMS aktivujte buď sekci Twilio, nebo sekci 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. Aktualizujte Views\Manage\Index.cshtml zobrazení Razor (pozor: neodstraňujte komentáře v existujícím kódu, použijte následující kód).

    @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. Ověřte, že metody akcí EnableTwoFactorAuthentication a DisableTwoFactorAuthentication v ManageController mají atribut[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. Spusťte aplikaci a přihlaste se pomocí účtu, který jste předtím zaregistrovali.

  5. Klikněte na své ID uživatele, které aktivuje metodu akce Index v kontroleru Manage.
    Snímek obrazovky z domovské stránky aplikace ASP.NET. Zvýrazněné je ukázkové uživatelské ID.

  6. Klikněte na Přidat.
    Snímek obrazovky, který ukazuje stránku nastavení účtu aplikace A S P dot NET. Zvýrazněna je možnost Přidat vedle části Telefonní číslo.

  7. Metoda akce AddPhoneNumber zobrazí dialogové okno pro zadání telefonního čísla, které může přijímat zprávy SMS.

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

    Snímek obrazovky, který ukazuje stránku Přidat telefonní číslo aplikace A S P dot NET. Ukázkové telefonní číslo je vyplněno, s tlačítkem Odeslat ověřovací kód umístěným pod ním.

  8. Za několik sekund dostanete textovou zprávu s ověřovacím kódem. Zadejte ho a stiskněte Odeslat.
    Snímek obrazovky aplikace ASP.NET na stránce Přidat telefonní číslo zobrazující vstupní pole vyplněné ukázkovým ověřovacím kódem a pod ním tlačítko Odeslat.

  9. Zobrazení Spravovat zobrazuje, že se přidalo vaše telefonní číslo.

Povolení dvoufaktorového ověřování

V aplikaci vytvořené podle šablony musíte použít uživatelské rozhraní k povolení dvojfaktorového ověřování (2FA). Pokud chcete povolit 2FA, klikněte na navigačním panelu na ID uživatele (alias e-mailu).

Snímek obrazovky zobrazující domovskou stránku aplikace A S P Je zvýrazněná ukázková ID uživatele.

Klikněte na povolit 2FA.

snímek obrazovky, který zobrazuje stránku Nastavení účtu aplikace ASP.NET. Two-Factor Ověřování: Zakázáno, zvýrazněna je sekce s odkazem Povolit.

Odhlaste se a pak se znovu přihlaste. Pokud jste povolili e-mail (viz můj předchozí kurz), můžete vybrat SMS nebo e-mail pro 2FA.

Snímek obrazovky znázorňující stránku aplikace ASP.NET Odeslat ověřovací kód. Rozevírací nabídka s telefonním kódem a e-mailovým kódem je vybraná.

Zobrazí se stránka Ověřit kód, kde můžete zadat kód (z SMS nebo e-mailu).

Snímek obrazovky, který zobrazuje stránku Ověření aplikace ASP.NET pro dvoufaktorové ověření. Pod vzorovým kódem je zvýrazněné zaškrtávací políčko Zapamatovat tento prohlížeč.

Kliknutím na zaškrtávací políčko Pamatovat si tento prohlížeč vás osvobodí od nutnosti použít 2FA při přihlašování pomocí prohlížeče a zařízení, kde jste políčko zaškrtli. Pokud uživatelé se zlými úmysly nebudou mít přístup k vašemu zařízení, povolíte 2FA a kliknete na Pamatovat si, že tento prohlížeč vám poskytne pohodlný přístup k jednomu kroku hesla a zároveň zachová silnou ochranu 2FA pro veškerý přístup z nedůvěryhodných zařízení. Můžete to udělat na jakémkoli privátním zařízení, které pravidelně používáte.

Tento kurz obsahuje rychlý úvod k povolení 2FA v nové aplikaci ASP.NET MVC. Můj kurz dvoufaktorové ověřování pomocí SMS a e-mailu s ASP.NET Identita podrobně rozebírá kód za ukázkou.

Další zdroje informací