Cvičení – konfigurace vícefaktorového ověřování

Dokončeno

Šablony projektu ASP.NET Core využívající architekturu Identity obsahují standardně podporu vícefaktorového ověřování přes ověřovací aplikace pro jednorázová hesla s časovým omezením (TOTP). Formulář pro konfiguraci ověřovací aplikace šablony Razor Pages poskytuje 32znakový registrační klíč pro počáteční hodnotu tokenu. V této lekci přizpůsobíte formulář pro konfiguraci ověřovací aplikace tak, že nabídne kód QR obsahující registrační klíč. Tento kód QR bude sloužit jako alternativní ověřovací mechanismus pro 32znakový klíč.

Pro generování kódu QR existuje několik strategií. Příkladem může být použití knihovny JavaScriptu třetí strany. V této lekci se ale používá balíček NuGet třetí strany ke generování kódu QR pomocí jazyka C#. Výsledný obrázek s kódem QR se vloží do zástupného elementu HTML jako řetězec s kódováním base-64.

Prohlídka infrastruktury pro generování kódu QR

Abychom se nepřestali soustředit na architekturu Identity, poskytujeme kostru pro podporu generování kódu QR. Mezi změny umožňující tuto podporu patří:

  • Balíček NuGet QRCoder je už nainstalovaný v projektu.
  • Všechny interakce s knihovnou QRCoder jsou abstrahovány v souboru Services/QRCodeService.cs. Třída QRCodeService:
    • Používá vložení konstruktoru pro získání přístupu k instanci třídy knihovny QRCodeGenerator.
    • Zpřístupňuje metodu GetQRCodeAsBase64 pro vrácení řetězce s kódováním base-64. Rozměry kódu QR jsou určeny celočíselnou hodnotou předanou do GetGraphic. V tomto případě bude vygenerovaný kód QR složen z čtvercových bloků o velikosti čtyř pixelů.
  • QRCodeService je zaregistrována jako jednoúčelová služba v kontejneru IoC v souboru Startup.cs.

Přizpůsobení vícefaktorového ověřování

  1. Otevřete soubor Areas/Identity/Pages/Account/Manage/EnableAuthenticator.cshtml.cs, proveďte následující změny a pak soubor uložte:

    1. Do třídy EnableAuthenticatorModel přidejte následující vlastnost pro uložení řetězcové reprezentace kódu QR s kódováním base-64:

      public class EnableAuthenticatorModel : PageModel
      {
          private readonly UserManager<ContosoPetsUser> _userManager;
          private readonly ILogger<EnableAuthenticatorModel> _logger;
          private readonly UrlEncoder _urlEncoder;
      
          public string QrCodeAsBase64 { get; set; }      
      
    2. Do obslužné rutiny stránky OnGetAsync začleňte zvýrazněné změny:

      public async Task<IActionResult> OnGetAsync([FromServices] QRCodeService qrCodeService)
      {
          var user = await _userManager.GetUserAsync(User);
          if (user == null)
          {
              return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
          }
      
          await LoadSharedKeyAndQrCodeUriAsync(user);
          QrCodeAsBase64 = qrCodeService.GetQRCodeAsBase64(AuthenticatorUri);
      
          return Page();
      }
      

      Vložení parametru v předchozí obslužné rutině stránky poskytuje odkaz na jednorázovou službu QRCodeService. QRCodeService zodpovídá za interakce s knihovnou třetí strany, která generuje kódy QR.

    3. Na začátek souboru přidejte následující příkaz using, který přeloží odkaz na QRCodeService. Uložte provedené změny.

      using ContosoPets.Ui.Services;
      
  2. V souboru Areas/Identity/Pages/Account/Manage/EnableAuthenticator.cshtml proveďte následující zvýrazněné změny a pak soubor uložte:

    <li>
        <p>Scan the QR Code or enter this key <kbd>@Model.SharedKey</kbd> into your two factor authenticator app. Spaces and casing do not matter.</p>
        <div class="alert alert-info">Learn how to <a href="https://go.microsoft.com/fwlink/?Linkid=852423">enable QR code generation</a>.</div>
        <div id="qrCode">
            <img alt="embedded QR code" src="data:image/png;base64,@Model.QrCodeAsBase64" />
        </div>
        <div id="qrCodeData" data-url="@Html.Raw(@Model.AuthenticatorUri)"></div>
    </li>
    

    Předchozí kód vloží na stránku obrázek s kódováním base-64.

Otestování vícefaktorového ověřování

  1. Spuštěním následujícího příkazu sestavte aplikaci:

    dotnet build --no-restore
    

    Parametr --no-restore je použitý, protože od posledního sestavení nebyly přidány žádné balíčky NuGet. Proces sestavení vynechá obnovení balíčků NuGet a úspěšně se dokončí bez upozornění. Pokud se sestavení nezdaří, zkontrolujte výstupní informace o odstraňování potíží.

  2. Spuštěním následujícího příkazu nasaďte aplikaci do Azure App Service:

    az webapp up
    
  3. Přejděte na web a přihlaste se pomocí některého zaregistrovaného uživatele (pokud už není přihlášený). Výběrem odkazu Hello, [jméno] [příjmení]! přejděte na stránku pro správu profilu a pak vyberte dvojúrovňové ověřování.

    Všimněte si následující zprávy na stránce:

    Privacy and cookie policy have not been accepted.
    You must accept the policy before you can enable two factor authentication.
    
  4. Kliknutím na odkaz pro přijetí v informační zprávě o zásadách ochrany osobních údajů a používání souborů cookie tyto zásady přijměte. Aktualizujte stránku.

    Vytvoří se soubor cookie s názvem .AspNet.Consent označující přijetí zásad. Platnost tohoto souboru cookie vyprší za jeden rok od data přijetí.

  5. Vyberte tlačítko pro přidání ověřovací aplikace.

  6. Podle pokynů na obrazovce zaregistrujte a ověřte ověřovací aplikaci pro tohoto uživatele.

    Jako příklad použijte aplikaci Microsoft Authenticator pro Android a následujícím postupem přidejte do této aplikace účet:

    1. Otevřete aplikaci Microsoft Authenticator.
    2. V pravém horním rohu vyberte nabídku (svislé tři tečky).
    3. Vyberte Přidat účet.
    4. Vyberte Jiný účet (Google, Facebook atd.).
    5. Při zobrazení výzvy naskenujte kód QR.
    6. Výběrem možnosti Dokončit ověřte 32znakový klíč.
  7. Do textového pole pro ověřovací kód zadejte ověřovací kód, který vám poskytla aplikace pro jednorázová hesla s časovým omezením (TOTP).

  8. Vyberte možnost ověření.

    Při úspěšném ověření se na stránce zobrazí informační zpráva, že ověřovací aplikace byla ověřena a několik kódů pro obnovení.

  9. Spuštěním následujícího příkazu zjistíte vliv na sloupec TwoFactorEnabled tabulky AspNetUsers:

    db -c 'SELECT "FirstName", "LastName", "Email", "TwoFactorEnabled" FROM "AspNetUsers"'
    

    U přihlášeného uživatele výstup ukazuje, že sloupec TwoFactorEnabled je roven t. Protože u druhého zaregistrovaného uživatele není vícefaktorové ověřování povolené, nabývá sloupec tohoto záznamu hodnoty f.

    db -Q "SELECT FirstName, LastName, Email, TwoFactorEnabled FROM dbo.AspNetUsers" -Y 25
    

    U přihlášeného uživatele výstup ukazuje, že sloupec TwoFactorEnabled je roven 1. Protože u druhého zaregistrovaného uživatele není vícefaktorové ověřování povolené, nabývá sloupec tohoto záznamu hodnoty 0.

  10. Vyberte možnost odhlášení a znovu se přihlaste pomocí stejného uživatele.

  11. Do textového pole pro ověřovací kód zadejte ověřovací kód z ověřovací aplikace pro jednorázová hesla s časovým omezením (TOTP). Vyberte tlačítko pro přihlášení.

  12. Vyberte odkaz Hello, [jméno] [příjmení]!. Pak vyberte kartu pro dvojúrovňové ověřování.

    Protože byla nastavena aplikace Microsoft Authenticator, zobrazí se následující tlačítka:

    • Disable 2FA (Zakázat dvojúrovňové ověřování)
    • Reset recovery codes (Resetovat kódy pro obnovení)
    • Set up authenticator app (Nastavit ověřovací aplikaci)
    • Reset authenticator app (Resetovat ověřovací aplikaci)