Sdílet prostřednictvím


Migrace z ověřování členství ASP.NET na ASP.NET Core 2.0 Identity

Autor Isaac Levin

Tento článek ukazuje migraci schématu databáze pro ASP.NET aplikace pomocí ověřování členství na ASP.NET Core 2.0 Identity.

Poznámka:

Tento dokument obsahuje kroky potřebné k migraci schématu databáze pro ASP.NET aplikace založené na členství do schématu databáze používaného pro ASP.NET Core Identity. Další informace o migraci z ověřování založeného na členství ASP.NET na ASP.NET Identitynaleznete v tématu Migrace existující aplikace z členství SQL do ASP.NET Identity. Další informace o ASP.NET Core Identitynaleznete v tématu Úvod do Identity ASP.NET Core.

Kontrola schématu členství

Před ASP.NET 2.0 měli vývojáři za úkol vytvořit pro své aplikace celý proces ověřování a autorizace. S ASP.NET 2.0 bylo zavedeno členství, které poskytuje často používané řešení pro zpracování zabezpečení v rámci ASP.NET aplikací. Vývojáři teď mohli spustit schéma do databáze SQL Serveru pomocí nástroje ASP.NET SQL Server Registration Tool () (Aspnet_regsql.exejiž není podporováno). Po spuštění tohoto příkazu byly v databázi vytvořeny následující tabulky.

Tabulky členství

Pokud chcete migrovat existující aplikace na ASP.NET Core 2.0 Identity, je potřeba migrovat data v těchto tabulkách do tabulek používaných novým Identity schématem.

schéma ASP.NET Core Identity 2.0

ASP.NET Core 2.0 se řídí principem Identity zavedený v ASP.NET 4.5. I když je princip sdílený, implementace mezi architekturami se liší i mezi verzemi ASP.NET Core (viz Migrace ověřování a Identity ASP.NET Core 2.0).

Nejrychlejší způsob, jak zobrazit schéma pro ASP.NET Core 2.0 Identity , je vytvořit novou aplikaci ASP.NET Core 2.0. V sadě Visual Studio 2017 postupujte takto:

  1. Vyberte Soubor>Nový>Projekt.

  2. Vytvořte nový projekt webové aplikace ASP.NET Core s názvem CoreIdentitySample.

  3. V rozevíracím seznamu vyberte ASP.NET Core 2.0 a pak vyberte Webová aplikace. Tato šablona vytvoří Razor aplikaci Pages . Než kliknete na OK, klikněte na Změnit ověřování.

  4. Zvolte pro šablony jednotlivé uživatelské účtyIdentity. Nakonec klikněte na OK a pak na OK. Visual Studio vytvoří projekt pomocí šablony ASP.NET Core Identity .

  5. Výběrem nástroje> NuGet Správce balíčků> Správce balíčků Konzola otevřete okno konzoly Správce balíčků (PMC).

  6. Přejděte do kořenového adresáře projektu v PMC a spusťte příkaz Entity Framework (EF) CoreUpdate-Database.

    ASP.NET Core 2.0 Identity používá EF Core k interakci s databází, do které se ukládají ověřovací data. Aby nově vytvořená aplikace fungovala, musí existovat databáze pro ukládání těchto dat. Po vytvoření nové aplikace je nejrychlejším způsobem, jak zkontrolovat schéma v databázovém prostředí, vytvořit databázi pomocí EF Core migrací. Tento proces vytvoří databázi místně nebo jinde, která napodobuje toto schéma. Další informace najdete v předchozí dokumentaci.

    EF Corepříkazy používají připojovací řetězec pro databázi zadanou v appsettings.json. Následující připojovací řetězec cílí na databázi na localhost s názvem asp-net-core-identity. V tomto nastavení EF Core je nakonfigurované použití DefaultConnection připojovací řetězec.

    {
      "ConnectionStrings": {
        "DefaultConnection": "Server=localhost;Database=aspnet-core-identity;Trusted_Connection=True;MultipleActiveResultSets=true"
      }
    }
    
  7. Vyberte Zobrazit>Průzkumník objektů SQL Serveru. Rozbalte uzel odpovídající názvu databáze zadanému ve ConnectionStrings:DefaultConnection vlastnosti appsettings.json.

    Příkaz Update-Database vytvořil databázi určenou schématem a všechna data potřebná k inicializaci aplikace. Následující obrázek znázorňuje strukturu tabulky, která je vytvořená pomocí předchozích kroků.

    Identity Tabulky

Migrace schématu

V tabulkových strukturách a polích pro členství i ASP.NET Core Identityexistují drobné rozdíly. Model se podstatně změnil pro ověřování a autorizaci s aplikacemi ASP.NET a ASP.NET Core. Klíčové objekty, se kterými se stále používají Identity , jsou Uživatelé a role. Tady jsou tabulky mapování pro uživatele, role a role uživatelů.

Uživatelé

Identity
(dbo.AspNetUsers) sloupec
Typ Členství
(dbo.aspnet_Users / dbo.aspnet_Membership) sloupec
Typ
Id string aspnet_Users.UserId string
UserName string aspnet_Users.UserName string
Email string aspnet_Membership.Email string
NormalizedUserName string aspnet_Users.LoweredUserName string
NormalizedEmail string aspnet_Membership.LoweredEmail string
PhoneNumber string aspnet_Users.MobileAlias string
LockoutEnabled bit aspnet_Membership.IsLockedOut bit

IsLockedOut nemapuje na LockoutEnabled. IsLockedOut je nastavena, pokud uživatel měl příliš mnoho neúspěšných přihlášení a je uzamčen na nastavený čas. LockoutEnabled umožňuje uzamknout uživatele s příliš mnoha neúspěšnými pokusy o přihlášení. Pokud má uživatel příliš mnoho neúspěšných pokusů o přihlášení, LockoutEnd nastaví se v budoucnu na datum a uživatel se nemůže přihlásit až do tohoto data. Pokud LockoutEnabled je false, uživatel není nikdy uzamčen pro příliš mnoho neúspěšných pokusů o přihlášení. U jednoho OWASP, dočasného uzamčení účtu po několika neúspěšných pokusech je příliš jednoduchý cíl útoků DoS proti legitimním uživatelům.

Další informace o uzamčení najdete v tématu Testování OWASP pro mechanismus slabého uzamčení.

Aplikace migrující na Identity to, které chtějí povolit neúspěšné uzamčení přihlášení, by měly být v rámci migrace nastaveny LockoutEnabled na true.

Poznámka:

Ne všechna mapování polí se podobají relacím 1:1 z členství do ASP.NET Core Identity. Předchozí tabulka přebírá výchozí schéma uživatele členství a mapuje ho na schéma ASP.NET Core Identity . Všechna ostatní vlastní pole používaná pro členství je potřeba namapovat ručně. V tomto mapování neexistuje žádná mapa hesel, protože mezi těmito dvěma hodnotami se nemigrují kritéria hesel i hesla. Doporučujeme ponechat heslo jako null a požádat uživatele o resetování hesel. V ASP.NET Core IdentityLockoutEnd by mělo být v budoucnu nastaveno na určité datum, pokud je uživatel uzamčen. To se zobrazí ve skriptu migrace.

Role

Identity
(dbo.AspNetRoles) sloupec
Typ Členství
(dbo.aspnet_Roles) sloupec
Typ
Id string RoleId string
Name string RoleName string
NormalizedName string LoweredRoleName string

Role uživatelů

Identity
(dbo.AspNetUserRoles) sloupec
Typ Členství
(dbo.aspnet_UsersInRoles) sloupec
Typ
RoleId string RoleId string
UserId string UserId string

Při vytváření skriptu migrace pro uživatele a role použijte odkaz na předchozí tabulky mapování. Následující příklad předpokládá, že máte dvě databáze na databázovém serveru. Jedna databáze obsahuje existující schéma a data členství ASP.NET. Druhá databáze CoreIdentitySample byla vytvořena pomocí kroků popsaných výše. Komentáře jsou zahrnuté přímo do textu, kde najdete další podrobnosti.

-- THIS SCRIPT NEEDS TO RUN FROM THE CONTEXT OF THE MEMBERSHIP DB
BEGIN TRANSACTION MigrateUsersAndRoles
USE aspnetdb

-- INSERT USERS
INSERT INTO CoreIdentitySample.dbo.AspNetUsers
            (Id,
             UserName,
             NormalizedUserName,
             PasswordHash,
             SecurityStamp,
             EmailConfirmed,
             PhoneNumber,
             PhoneNumberConfirmed,
             TwoFactorEnabled,
             LockoutEnd,
             LockoutEnabled,
             AccessFailedCount,
             Email,
             NormalizedEmail)
SELECT aspnet_Users.UserId,
       aspnet_Users.UserName,
       -- The NormalizedUserName value is upper case in ASP.NET Core Identity
       UPPER(aspnet_Users.UserName),
       -- Creates an empty password since passwords don't map between the 2 schemas
       '',
       /*
        The SecurityStamp token is used to verify the state of an account and
        is subject to change at any time. It should be initialized as a new ID.
       */
       NewID(),
       /*
        EmailConfirmed is set when a new user is created and confirmed via email.
        Users must have this set during migration to reset passwords.
       */
       1,
       aspnet_Users.MobileAlias,
       CASE
         WHEN aspnet_Users.MobileAlias IS NULL THEN 0
         ELSE 1
       END,
       -- 2FA likely wasn't setup in Membership for users, so setting as false.
       0,
       CASE
         -- Setting lockout date to time in the future (1,000 years)
         WHEN aspnet_Membership.IsLockedOut = 1 THEN Dateadd(year, 1000,
                                                     Sysutcdatetime())
         ELSE NULL
       END,
       aspnet_Membership.IsLockedOut,
       /*
        AccessFailedAccount is used to track failed logins. This is stored in
        Membership in multiple columns. Setting to 0 arbitrarily.
       */
       0,
       aspnet_Membership.Email,
       -- The NormalizedEmail value is upper case in ASP.NET Core Identity
       UPPER(aspnet_Membership.Email)
FROM   aspnet_Users
       LEFT OUTER JOIN aspnet_Membership
                    ON aspnet_Membership.ApplicationId =
                       aspnet_Users.ApplicationId
                       AND aspnet_Users.UserId = aspnet_Membership.UserId
       LEFT OUTER JOIN CoreIdentitySample.dbo.AspNetUsers
                    ON aspnet_Membership.UserId = AspNetUsers.Id
WHERE  AspNetUsers.Id IS NULL

-- INSERT ROLES
INSERT INTO CoreIdentitySample.dbo.AspNetRoles(Id, Name)
SELECT RoleId, RoleName
FROM aspnet_Roles;

-- INSERT USER ROLES
INSERT INTO CoreIdentitySample.dbo.AspNetUserRoles(UserId, RoleId)
SELECT UserId, RoleId
FROM aspnet_UsersInRoles;

IF @@ERROR <> 0
  BEGIN
    ROLLBACK TRANSACTION MigrateUsersAndRoles
    RETURN
  END

COMMIT TRANSACTION MigrateUsersAndRoles

Po dokončení předchozího skriptu se aplikace ASP.NET Core Identity vytvořená dříve naplní uživateli členství. Uživatelé musí před přihlášením změnit svá hesla.

Poznámka:

Pokud systém členství měl uživatele s uživatelskými jmény, které se neshodovaly s jejich e-mailovou adresou, musí se změny v aplikaci vytvořené dříve přizpůsobit. Výchozí šablona očekává UserName a Email bude stejná. V situacích, ve kterých se liší, je potřeba upravit proces přihlášení tak, aby používal UserName místo Email.

PageModel Na přihlašovací stránce, která se nachází na adrese , odeberte [EmailAddress] atribut z vlastnosti E-mail. Přejmenujte ho na UserName. To vyžaduje změnu bez ohledu na to, kde EmailAddress je uvedeno, v modelu Zobrazení a PageModel. Výsledek vypadá takto:

Opravené přihlášení

Další kroky

V tomto kurzu jste zjistili, jak přenést uživatele z členství SQL na ASP.NET Core 2.0 Identity. Další informace o ASP.NET Core Identitynaleznete v tématu Úvod do Identity.