Megosztás a következőn keresztül:


ASP.NET MVC 5 alkalmazás SMS-sel és e-mail-Two-Factor hitelesítéssel

készítette: Rick Anderson

Ez az oktatóanyag bemutatja, hogyan hozhat létre ASP.NET MVC 5-webalkalmazást Two-Factor-hitelesítéssel. A folytatás előtt be kell fejeznie Biztonságos ASP.NET MVC 5 webalkalmazás létrehozása bejelentkezéssel, e-mail-megerősítéssel és jelszó-visszaállítással. A befejezett alkalmazás itt töltheti le. A letöltés hibakeresési segédeket tartalmaz, amelyek lehetővé teszik az e-mailek megerősítésének és az SMS-nek az e-mail vagy SMS-szolgáltató beállítása nélküli tesztelését.

Ez az oktatóanyag írta Rick Anderson ( Twitter: @RickAndMSFT ).

ASP.NET MVC-alkalmazás létrehozása

Első lépésként telepítse és futtassa a Visual Studio Express 2013 for Web vagy újabb verzióját.

Jegyzet

Figyelmeztetés: A folytatás előtt be kell fejeznie Biztonságos ASP.NET MVC 5 webalkalmazás létrehozása bejelentkezéssel, e-mail-megerősítéssel és jelszó-visszaállítással. Az oktatóanyag elvégzéséhez telepítenie kell Visual Studio 2013 3. frissítésének vagy újabb verzióját.

  1. Hozzon létre egy új ASP.NET webes projektet, és válassza ki az MVC-sablont. A Web Forms támogatja az ASP.NET Identitást is, így egy webűrlapalkalmazás hasonló lépéseit követheti.
    Képernyőkép az Új A S P pont NET-projekt ablakról. Az alapértelmezett hitelesítés( egyéni felhasználói fiókok) ki van emelve.
  2. Hagyja meg alapértelmezett hitelesítésként az egyéni felhasználói fiókokkal történő hitelesítést . Ha az alkalmazást az Azure-ban szeretné üzemeltetni, hagyja bejelölve a jelölőnégyzetet. Az oktatóanyag későbbi részében üzembe helyezünk az Azure-ban. Ingyenesnyithat Meg egy Azure-fiókot.
  3. Állítsa be a projektet SSL-használatára.

SMS beállítása kéttényezős hitelesítéshez

Ez az oktatóanyag útmutatást nyújt a Twilio vagy az ASPSMS használatához, de bármely más SMS-szolgáltatót használhat.

  1. Felhasználói fiók létrehozása SMS-szolgáltatóval

    Hozzon létre egy Twilio- vagy egy ASPSMS-fiókot.

  2. További csomagok telepítése vagy szolgáltatáshivatkozások hozzáadása

    Twilio:
    A Package Manager konzolon adja meg a következő parancsot:
    Install-Package Twilio

    ASPSMS:
    A következő szolgáltatáshivatkozást kell hozzáadni:

    Az „Szolgáltatás hozzáadása” ablakot ábrázoló képernyőkép. A Cím és Névtér beviteli sávjai ki vannak jelölve.

    Cím:
    https://webservice.aspsms.com/aspsmsx2.asmx?WSDL

    Namespace:
    ASPSMSX2

  3. Az SMS-szolgáltató felhasználói hitelesítő adatainak kiderítése

Javasoljuk, hogy a legbiztonságosabb hitelesítési lehetőséget használja. Az Azure-ban üzembe helyezett .NET-alkalmazásokért lásd:

Az Azure Key Vault és .NET Aspire biztosítják a titkos kódok tárolásának és lekérésének legbiztonságosabb módját. Az Azure Key Vault egy felhőalapú szolgáltatás, amely védi a titkosítási kulcsokat és titkos kulcsokat, például a tanúsítványokat, a kapcsolati sztringeket és a jelszavakat. A .NET Aspire-ről a Az üzemeltetés és az ügyfélintegrációk közötti biztonságos kommunikációcímű témakörben olvashat.

Kerülje az erőforrás-tulajdonos jelszó hitelesítő adatainak megadását, mert:

  • Elérhetővé teszi a felhasználó jelszavát az ügyfél számára.
  • Jelentős biztonsági kockázat.
  • Csak akkor használható, ha más hitelesítési folyamatok nem lehetségesek.

Amikor az alkalmazást egy tesztkiszolgálón helyezik üzembe, egy környezeti változóval a kapcsolati sztringet egy tesztadatbázis-kiszolgálóra állíthatja be. A környezeti változók általában egyszerű, titkosítatlan szövegben vannak tárolva. Ha a gép vagy a folyamat sérült, a környezeti változókat nem megbízható felek érhetik el. Nem javasoljuk, hogy környezeti változók használatával tároljon éles kapcsolati láncot, mivel nem ez a legbiztonságosabb módszer.

Konfigurációs adatokra vonatkozó irányelvek:

  • Soha ne tároljon jelszavakat vagy más bizalmas adatokat konfigurációszolgáltatói kódban vagy egyszerű szöveges konfigurációs fájlokban.
  • Ne használj üzemi titkokat fejlesztési vagy tesztelési környezetekben.
  • Adja meg a projekten kívüli érzékeny adatokat, hogy ezek véletlenül ne kerüljenek feltöltve egy forráskód-tárházba.

Twilio:
A Twilio-fiók Irányítópult lapján másolja ki a fiók SID- és hitelesítési jogkivonatát.

ASPSMS:
A fiókbeállítások között keresse meg a Userkey-et, és másolja azt együtt a saját maga által meghatározott Jelszó-mal.

Később ezeket az értékeket a és "SMSAccountIdentification" kulcsokhoz a "SMSAccountPassword" fájlban tároljuk. 4. Küldő azonosítója/származtatója megadása

Twilio:
A Számok lapon másolja ki a Twilio-telefonszámot.

ASPSMS:
A Kezdeményezők zárolásának feloldása menüben oldja fel egy vagy több kezdeményező zárolását, vagy válasszon alfanumerikus kezdeményezőt (az összes hálózat nem támogatja).

Ezt az értéket később a web.config fájlban tároljuk a kulcs "SMSAccountFrom" . 5. SMS-szolgáltató hitelesítő adatainak átvitele az alkalmazásba

A hitelesítő adatok és a feladó telefonszámának elérhetővé tétele az alkalmazás számára. Az egyszerűség érdekében ezeket az értékeket a web.config fájlban tároljuk. Az Azure-ban való üzembe helyezéskor az értékeket biztonságosan tárolhatjuk a webhely konfigurálás lapjának alkalmazásbeállítások szakaszában.

[!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-szolgáltatónak történő adatátvitel megvalósítása

    Konfigurálja a SmsService osztályt a App_Start\IdentityConfig.cs fájlban.

    A használt SMS-szolgáltatótól függően aktiválja a Twilio vagy a ASPSMS szakaszt:

    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. Frissítse a Views\Manage\Index.cshtml Razor nézetet: (megjegyzés: ne csak távolítsa el a megjegyzéseket a kilépési kódban, használja az alábbi kódot.)

    @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. Ellenőrizze, hogy a EnableTwoFactorAuthenticationDisableTwoFactorAuthentication és ManageController műveleti metódusa rendelkezik-e az[ValidateAntiForgeryToken] attribútummal:

    //
    // 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. Futtassa az alkalmazást, és jelentkezzen be a korábban regisztrált fiókkal.

  5. Kattintson a felhasználói azonosítójára, amely aktiválja a Index műveletmetódust Manage vezérlőben.
    Képernyőkép az ASP.NET alkalmazás kezdőlapjáról. Egy mintafelhasználói azonosító van kiemelve.

  6. Kattintson a Hozzáadás gombra.
    Képernyőkép az A S P pont NET-alkalmazás fiókbeállítások lapjáról. Nincs Hozzáadás a Telefonszám szakasz mellett ki van emelve.

  7. A AddPhoneNumber műveletmetódus egy párbeszédpanelt jelenít meg, amely megadja az SMS-üzenetek fogadására képes telefonszámot.

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

    Képernyőkép, amely az A S P pont NET-alkalmazás Telefonszám hozzáadása oldalát mutatja. Egy minta telefonszám van kitöltve, és alatta található az Ellenőrző kód küldése gomb.

  8. Néhány másodperc múlva megjelenik egy szöveges üzenet az ellenőrző kóddal. Adja meg, majd nyomja meg a Küldésgombot.
    Képernyőkép az A S P pont NET-alkalmazás Telefonszám hozzáadása oldaláról, amelyen egy minta ellenőrzési kóddal kitöltött beviteli sáv és alatta a Küldés gomb látható.

  9. A Manage (Kezelés) nézet azt mutatja, hogy a telefonszám hozzáadva lett.

Kéttényezős hitelesítés engedélyezése

A sablon által létrehozott alkalmazásban a felhasználói felületen engedélyeznie kell a kéttényezős hitelesítést (2FA). A 2FA engedélyezéséhez kattintson a felhasználói azonosítójára (e-mail aliasára) a navigációs sávon.

Képernyőkép az ASP.NET alkalmazás kezdőlapjáról. Egy minta felhasználói azonosító ki van emelve.

Kattintson a 2FA engedélyezésére.

Képernyőkép az A S P pont NET-alkalmazás fiókbeállítások lapjáról. Two-Factor Hitelesítés: Letiltva, az Engedélyezés hivatkozás szakasza ki van emelve.

Jelentkezzen ki, majd jelentkezzen be újra. Ha engedélyezte az e-maileket (lásd a korábbi oktatóanyagot), kiválaszthatja a 2FA-hoz tartozó SMS-t vagy e-mailt.

Képernyőkép az A S P pont NET-alkalmazás Ellenőrzőkód küldése lapjáról. Ki van jelölve egy legördülő menü, amelyen a Telefonkód és az E-mail-kód látható.

Megjelenik a Kód ellenőrzése lap, ahol beírhatja a kódot (SMS-ből vagy e-mailből).

Képernyőkép, amely az A S P pont NET-alkalmazás kétfaktoros hitelesítéshez tartozó Ellenőrző oldalát jeleníti meg. A mintakód alatt az

A Ne feledje ezt a böngészőt jelölőnégyzetre kattintva mentesül a 2FA használata alól a bejelentkezéshez azon a böngészőn és eszközön, ahol bejelölte ezt a négyzetet. Mindaddig, amíg a rosszindulatú felhasználók nem férnek hozzá az eszközéhez, a 2FA engedélyezése és a Ne feledje ezt a böngészőt opció választása kényelmes egylépéses jelszóhasználatot tesz lehetővé, miközben megőrzi az erős 2FA-védelmet az összes nem megbízható eszközről történő hozzáféréshez. Ezt bármely rendszeresen használt magáneszközön megteheti.

Ez az oktatóanyag gyors bevezetést nyújt a 2FA engedélyezéséhez egy új ASP.NET MVC-alkalmazáson. Az oktatóanyagom kéttényezős hitelesítést SMS és e-mail segítségével az ASP.NET Identity keretrendszerrel részletesen bemutatja, és a minta mögötti kódot is alaposan elemzi.

További erőforrások