Sdílet prostřednictvím


Přehled poskytovatelů vlastního úložiště pro ASP.NET Identity

, autor: Tom FitzMacken

ASP.NET Identity je rozšiřitelný systém, který umožňuje vytvořit vlastního zprostředkovatele úložiště a připojit ho do aplikace bez opětovného zpracování aplikace. Toto téma popisuje, jak vytvořit vlastního zprostředkovatele úložiště pro ASP.NET Identity. Popisuje důležité koncepty vytvoření vlastního poskytovatele úložiště, ale nejedná se o podrobný návod k implementaci vlastního poskytovatele úložiště.

Příklad implementace vlastního poskytovatele úložiště najdete v tématu Implementace vlastního zprostředkovatele úložiště identit MySQL ASP.NET.

Toto téma bylo aktualizováno pro ASP.NET Identity 2.0.

Verze softwaru použité v tomto kurzu

  • Visual Studio 2013 s aktualizací Update 2
  • ASP.NET Identity 2

Úvod

Ve výchozím nastavení systém identit ASP.NET ukládá informace o uživateli do databáze SQL Server a k vytvoření databáze používá Entity Framework Code First. U mnoha aplikací tento přístup funguje dobře. Můžete ale raději použít jiný typ mechanismu trvalosti, například Azure Table Storage, nebo už můžete mít databázové tabulky s velmi odlišnou strukturou, než je výchozí implementace. V obou případech můžete napsat vlastního poskytovatele pro mechanismus úložiště a zapojit ho do své aplikace.

ASP.NET Identity je ve výchozím nastavení součástí mnoha šablon Visual Studio 2013. Aktualizace ASP.NET Identity můžete získat prostřednictvím balíčku NuGet Microsoft AspNet Identity EntityFramework.

Toto téma zahrnuje následující části:

Principy architektury

ASP.NET Identity se skládá z tříd označovaných jako manažeři a obchody. Manažeři jsou třídy vysoké úrovně, které vývojář aplikace používá k provádění operací, jako je například vytvoření uživatele, v systému ASP.NET Identity. Obchody jsou třídy nižší úrovně, které určují způsob zachování entit, jako jsou uživatelé a role. Obchody jsou úzce provázány s mechanismem trvalosti, ale správci jsou odděleni od úložišť, což znamená, že můžete nahradit mechanismus trvalosti, aniž by došlo k narušení celé aplikace.

Následující diagram znázorňuje, jak webová aplikace komunikuje se správci a jak úložiště interagují s vrstvou přístupu k datům.

Diagram znázorňující interakci webové aplikace se správci

Pokud chcete vytvořit přizpůsobeného poskytovatele úložiště pro ASP.NET Identity, musíte vytvořit zdroj dat, vrstvu přístupu k datům a třídy úložiště, které s touto vrstvou přístupu k datům pracují. K provádění datových operací s uživatelem můžete dál používat stejná rozhraní API správce, ale teď se data ukládají do jiného systému úložiště.

Není nutné přizpůsobovat třídy správce, protože při vytváření nové instance UserManager nebo RoleManager zadáte typ třídy uživatele a předáte instanci třídy úložiště jako argument. Tento přístup umožňuje zapojit přizpůsobené třídy do stávající struktury. V části Změna konfigurace aplikace pro použití nového poskytovatele úložiště se dozvíte, jak vytvořit instanci userManager a RoleManager s vašimi přizpůsobenými třídami úložiště.

Vysvětlení uložených dat

Pokud chcete implementovat vlastního zprostředkovatele úložiště, musíte porozumět typům dat používaných s ASP.NET Identity a rozhodnout, které funkce jsou pro vaši aplikaci relevantní.

Data Description
Uživatelé Registrovaní uživatelé vašeho webu. Zahrnuje ID uživatele a uživatelské jméno. Může obsahovat heslo s hodnotou hash, pokud se uživatelé přihlašují pomocí přihlašovacích údajů, které jsou specifické pro váš web (místo použití přihlašovacích údajů z externího webu, jako je Facebook), a razítko zabezpečení, které označuje, jestli se v přihlašovacích údajích uživatele něco změnilo. Může také zahrnovat e-mailovou adresu, telefonní číslo, informace o tom, jestli je povolené dvojúrovňové ověřování, aktuální počet neúspěšných přihlášení a jestli je účet uzamčený.
Deklarace identity uživatelů Sada příkazů (nebo deklarací identity) o uživateli, které představují identitu uživatele. Umožňuje větší vyjádření identity uživatele, než je možné dosáhnout pomocí rolí.
Přihlášení uživatelů Informace o externím poskytovateli ověřování (jako je Facebook), který se má použít při přihlašování uživatele.
Role Skupiny autorizace pro váš web. Zahrnuje ID role a název role (například "Správa" nebo "Zaměstnanec").

Vytvoření vrstvy přístupu k datům

Toto téma předpokládá, že jste obeznámeni s mechanismem trvalosti, který budete používat, a s tím, jak pro tento mechanismus vytvářet entity. Toto téma neposkytuje podrobnosti o tom, jak vytvořit úložiště nebo třídy přístupu k datům. místo toho poskytuje několik návrhů ohledně rozhodnutí o návrhu, která je potřeba provést při práci s ASP.NET Identity.

Při návrhu úložišť pro přizpůsobeného poskytovatele úložiště máte velkou volnost. Potřebujete jenom vytvořit úložiště pro funkce, které chcete použít ve své aplikaci. Pokud například ve své aplikaci nepoužíváte role, nemusíte vytvářet úložiště pro role nebo role uživatelů. Vaše technologie a stávající infrastruktura můžou vyžadovat strukturu, která se velmi liší od výchozí implementace ASP.NET Identity. Ve vrstvě přístupu k datům zadáte logiku pro práci se strukturou vašich úložišť.

Implementaci úložišť dat MySQL pro ASP.NET Identity 2.0 najdete v tématu MySQLIdentity.sql.

Ve vrstvě přístupu k datům zadáte logiku pro uložení dat z ASP.NET Identity do zdroje dat. Vrstva přístupu k datům pro přizpůsobeného poskytovatele úložiště může obsahovat následující třídy pro ukládání informací o uživatelích a rolích.

Třída Popis Příklad
Kontext Zapouzdří informace pro připojení k mechanismu trvalosti a spouštění dotazů. Tato třída je centrální pro vaši vrstvu přístupu k datům. Ostatní datové třídy budou k provádění svých operací vyžadovat instanci této třídy. Inicializujete také třídy obchodu s instancí této třídy. Databáze MySQLDatabase
Uživatelské úložiště Ukládá a načítá informace o uživateli (například uživatelské jméno a hodnotu hash hesla). UserTable (MySQL)
Úložiště rolí Ukládá a načítá informace o roli (například název role). RoleTable (MySQL)
UserClaims Storage Ukládá a načítá informace o deklaraci identity uživatele (například typ a hodnotu deklarace identity). UserClaimsTable (MySQL)
UserLogins Storage Ukládá a načítá přihlašovací údaje uživatele (například externího zprostředkovatele ověřování). Tabulka UserLoginsTable (MySQL)
UserRole Storage Ukládá a načítá role, ke kterým je uživatel přiřazený. Tabulka UserRoleTable (MySQL)

Opět stačí implementovat pouze třídy, které chcete použít ve své aplikaci.

Ve třídách přístupu k datům zadáte kód pro provádění operací s daty pro váš konkrétní mechanismus trvalosti. Například v rámci mySQL implementace UserTable třída obsahuje metodu pro vložení nového záznamu do tabulky databáze Users. Proměnná s názvem _database je instance mySQLDatabase třídy.

public int Insert(TUser user)
{
    string commandText = @"Insert into Users (UserName, Id, PasswordHash, SecurityStamp,Email,EmailConfirmed,PhoneNumber,PhoneNumberConfirmed, AccessFailedCount,LockoutEnabled,LockoutEndDateUtc,TwoFactorEnabled)
        values (@name, @id, @pwdHash, @SecStamp,@email,@emailconfirmed,@phonenumber,@phonenumberconfirmed,@accesscount,@lockoutenabled,@lockoutenddate,@twofactorenabled)";
    Dictionary<string, object> parameters = new Dictionary<string, object>();
    parameters.Add("@name", user.UserName);
    parameters.Add("@id", user.Id);
    parameters.Add("@pwdHash", user.PasswordHash);
    parameters.Add("@SecStamp", user.SecurityStamp);
    parameters.Add("@email", user.Email);
    parameters.Add("@emailconfirmed", user.EmailConfirmed);
    parameters.Add("@phonenumber", user.PhoneNumber);
    parameters.Add("@phonenumberconfirmed", user.PhoneNumberConfirmed);
    parameters.Add("@accesscount", user.AccessFailedCount);
    parameters.Add("@lockoutenabled", user.LockoutEnabled);
    parameters.Add("@lockoutenddate", user.LockoutEndDateUtc);
    parameters.Add("@twofactorenabled", user.TwoFactorEnabled);

    return _database.Execute(commandText, parameters);
}

Po vytvoření tříd přístupu k datům musíte vytvořit třídy úložiště, které volají konkrétní metody ve vrstvě přístupu k datům.

Přizpůsobení třídy uživatele

Při implementaci vlastního zprostředkovatele úložiště musíte vytvořit třídu uživatele, která odpovídá třídě IdentityUser v oboru názvů Microsoft.ASP.NET.Identity.EntityFramework :

Následující diagram znázorňuje Třídu IdentityUser, kterou musíte vytvořit, a rozhraní, které se má implementovat v této třídě.

Obrázek třídy Identity User

Rozhraní IUser<TKey> definuje vlastnosti, které se UserManager pokusí volat při provádění požadovaných operací. Rozhraní obsahuje dvě vlastnosti – Id a UserName. Rozhraní IUser<TKey> umožňuje určit typ klíče pro uživatele prostřednictvím obecného parametru TKey . Typ vlastnosti Id odpovídá hodnotě parametru TKey.

Architektura identity také poskytuje rozhraní IUser (bez obecného parametru), pokud chcete pro klíč použít řetězcovou hodnotu.

Třída IdentityUser implementuje IUser a obsahuje všechny další vlastnosti nebo konstruktory pro uživatele na webu. Následující příklad ukazuje IdentityUser třídy, která používá celé číslo pro klíč. Pole Id je nastaveno na int , aby odpovídalo hodnotě obecného parametru.

public class IdentityUser : IUser<int>
{
    public IdentityUser() { ... }
    public IdentityUser(string userName) { ... }
    public int Id { get; set; }
    public string UserName { get; set; }
    // can also define optional properties such as:
    //    PasswordHash
    //    SecurityStamp
    //    Claims
    //    Logins
    //    Roles
}

Úplnou implementaci najdete v tématu IdentityUser (MySQL).

Přizpůsobení úložiště uživatelů

Také vytvoříte třídu UserStore, která poskytuje metody pro všechny operace s daty na uživateli. Tato třída je ekvivalentem třídy UserStore<TUser> v oboru názvů Microsoft.ASP.NET.Identity.EntityFramework . Ve třídě UserStore implementujete IUserStore<TUser, TKey> a libovolné volitelné rozhraní. Volitelná rozhraní, která se mají implementovat, vyberete na základě funkcí, které chcete ve své aplikaci poskytnout.

Následující obrázek ukazuje třídu UserStore, kterou musíte vytvořit, a příslušná rozhraní.

Obrázek třídy Úložiště uživatelů

Výchozí šablona projektu v sadě Visual Studio obsahuje kód, který předpokládá, že mnoho volitelných rozhraní bylo implementováno v úložišti uživatelů. Pokud používáte výchozí šablonu s vlastním uživatelským úložištěm, musíte buď implementovat volitelná rozhraní v úložišti uživatelů, nebo změnit kód šablony tak, aby už nevolal metody v rozhraních, která jste neimplementovali.

Následující příklad ukazuje jednoduchou třídu úložiště uživatelů. Obecný parametr TUser přebírá typ třídy uživatele, což je obvykle třída IdentityUser, kterou jste definovali. Obecný parametr TKey přebírá typ vašeho uživatelského klíče.

public class UserStore : IUserStore<IdentityUser, int>
{
    public UserStore() { ... }
    public UserStore(ExampleStorage database) { ... }
    public Task CreateAsync(IdentityUser user) { ... }
    public Task DeleteAsync(IdentityUser user) { ... }
    public Task<IdentityUser> FindByIdAsync(int userId) { ... }
    public Task<IdentityUser> FindByNameAsync(string userName) { ... }
    public Task UpdateAsync(IdentityUser user) { ... }
    public void Dispose() { ... }
}

V tomto příkladu je konstruktor, který přebírá parametr database typu ExampleDatabase, pouze ilustrací toho, jak předat třídu přístupu k datům. Například v implementaci MySQL tento konstruktor přebírá parametr typu MySQLDatabase.

V rámci třídy UserStore použijete k provádění operací třídy pro přístup k datům, které jste vytvořili. Například v implementaci MySQL má třída UserStore metodu CreateAsync, která používá instanci UserTable k vložení nového záznamu. Metoda Insert u objektu userTable je stejná jako metoda zobrazená v předchozí části.

public Task CreateAsync(IdentityUser user)
{
    if (user == null) {
        throw new ArgumentNullException("user");
    }

    userTable.Insert(user);

    return Task.FromResult<object>(null);
}

Rozhraní, která se mají implementovat při přizpůsobení úložiště uživatelů

Další obrázek ukazuje další podrobnosti o funkcích definovaných v jednotlivých rozhraních. Všechna volitelná rozhraní dědí z IUserStore.

Obrázek znázorňující další podrobnosti o funkcích definovaných v jednotlivých rozhraních

  • IUserStore
    IUserStore<TUser, TKey> rozhraní je jediné rozhraní, které musíte implementovat v úložišti uživatele. Definuje metody pro vytváření, aktualizaci, odstraňování a načítání uživatelů.

  • IUserClaimStore
    Rozhraní IUserClaimStore<TUser, TKey> definuje metody, které je nutné implementovat v úložišti uživatelů, aby bylo možné deklarace identity uživatelů. Obsahuje metody nebo přidávání, odebírání a načítání deklarací identity uživatelů.

  • IUserLoginStore
    IUserLoginStore<TUser, TKey> definuje metody, které musíte implementovat v úložišti uživatele, abyste povolili externí zprostředkovatele ověřování. Obsahuje metody pro přidání, odebrání a načtení přihlášení uživatelů a metodu pro načtení uživatele na základě přihlašovacích údajů.

  • IUserRoleStore
    Rozhraní IUserRoleStore<TKey, TUser> definuje metody, které je nutné implementovat v úložišti uživatele k mapování uživatele na roli. Obsahuje metody pro přidání, odebrání a načtení rolí uživatele a metodu pro kontrolu, jestli je uživatel přiřazený k roli.

  • IUserPasswordStore
    Rozhraní IUserPasswordStore<TUser, TKey> definuje metody, které je nutné implementovat v úložišti uživatele k zachování hesel hash. Obsahuje metody pro získání a nastavení hesla s hodnotou hash a metodu, která označuje, jestli uživatel nastavil heslo.

  • IUserSecurityStampStore
    Rozhraní IUserSecurityStampStore<TUser, TKey> definuje metody, které je nutné implementovat v úložišti uživatele k použití razítka zabezpečení pro označení, zda se změnily informace o účtu uživatele. Toto razítko se aktualizuje, když uživatel změní heslo nebo přidá nebo odebere přihlášení. Obsahuje metody pro získání a nastavení razítka zabezpečení.

  • IUserTwoFactorStore
    Rozhraní IUserTwoFactorStore<TUser, TKey> definuje metody, které je nutné implementovat k implementaci dvojúrovňového ověřování. Obsahuje metody pro získání a nastavení, jestli je pro uživatele povolené dvojúrovňové ověřování.

  • IUserPhoneNumberStore
    Rozhraní IUserPhoneNumberStore<TUser, TKey> definuje metody, které je nutné implementovat k ukládání telefonních čísel uživatele. Obsahuje metody pro získání a nastavení telefonního čísla a informace o tom, jestli je telefonní číslo potvrzené.

  • IUserEmailStore
    Rozhraní IUserEmailStore<TUser, TKey> definuje metody, které je nutné implementovat k ukládání e-mailových adres uživatelů. Obsahuje metody pro získání a nastavení e-mailové adresy a ověření potvrzení e-mailu.

  • IUserLockoutStore
    Rozhraní IUserLockoutStore<TUser, TKey> definuje metody, které je nutné implementovat k ukládání informací o uzamčení účtu. Obsahuje metody pro získání aktuálního počtu neúspěšných pokusů o přístup, získání a nastavení, zda je možné účet uzamknout, získání a nastavení koncového data uzamčení, zvýšení počtu neúspěšných pokusů a resetování počtu neúspěšných pokusů.

  • IQueryableUserStore
    Rozhraní IQueryableUserStore<TUser, TKey> definuje členy, které je nutné implementovat, aby bylo možné zadat dotazovatelné úložiště uživatele. Obsahuje vlastnost, která obsahuje dotazovatelné uživatele.

    Implementujete rozhraní, která jsou ve vaší aplikaci potřebná. například IUserClaimStore, IUserLoginStore, IUserRoleStore, IUserPasswordStore a IUserSecurityStampStore rozhraní, jak je znázorněno níže.

public class UserStore : IUserStore<IdentityUser, int>,
                         IUserClaimStore<IdentityUser, int>,
                         IUserLoginStore<IdentityUser, int>,
                         IUserRoleStore<IdentityUser, int>,
                         IUserPasswordStore<IdentityUser, int>,
                         IUserSecurityStampStore<IdentityUser, int>
{
    // interface implementations not shown
}

Úplnou implementaci (včetně všech rozhraní) najdete v tématu UserStore (MySQL).

IdentityUserClaim, IdentityUserLogin a IdentityRole uživatele

Microsoft.AspNet.Identity.EntityFramework obor názvů obsahuje implementace Třídy IdentityUserClaim, IdentityUserLogin a IdentityUserRole . Pokud používáte tyto funkce, můžete chtít vytvořit vlastní verze těchto tříd a definovat vlastnosti pro vaši aplikaci. Někdy je ale efektivnější tyto entity při provádění základních operací nenačítat do paměti (například přidání nebo odebrání deklarace identity uživatele). Místo toho mohou třídy back-endového úložiště tyto operace provádět přímo ve zdroji dat. Například UserStore.GetClaimsAsync() metoda může volat userClaimTable.FindByUserId(user. Id), která provede dotaz přímo na danou tabulku a vrátí seznam deklarací identity.

public Task<IList<Claim>> GetClaimsAsync(IdentityUser user)
{
    ClaimsIdentity identity = userClaimsTable.FindByUserId(user.Id);
    return Task.FromResult<IList<Claim>>(identity.Claims.ToList());
}

Přizpůsobení třídy role

Při implementaci vlastního zprostředkovatele úložiště musíte vytvořit třídu role, která je ekvivalentní třídě IdentityRole v oboru názvů Microsoft.ASP.NET.Identity.EntityFramework :

Následující diagram znázorňuje třídu IdentityRole, kterou musíte vytvořit, a rozhraní, které se má implementovat v této třídě.

Obrázek třídy Role identity

Rozhraní IRole<TKey> definuje vlastnosti, které se RoleManager pokusí volat při provádění požadovaných operací. Rozhraní obsahuje dvě vlastnosti – Id a Název. Rozhraní IRole<TKey> umožňuje určit typ klíče pro roli prostřednictvím obecného parametru TKey . Typ vlastnosti Id odpovídá hodnotě parametru TKey.

Rozhraní Identity také poskytuje rozhraní IRole (bez obecného parametru), pokud chcete pro klíč použít řetězcovou hodnotu.

Následující příklad ukazuje IdentityRole třídy, která používá celé číslo pro klíč. Pole Id je nastaveno na int, aby odpovídalo hodnotě obecného parametru.

public class IdentityRole : IRole<int>
{
    public IdentityRole() { ... }
    public IdentityRole(string roleName) { ... }
    public int Id { get; set; }
    public string Name { get; set; }
}

Úplnou implementaci najdete v tématu Role identity (MySQL).

Přizpůsobení úložiště rolí

Vytvoříte také třídu RoleStore, která poskytuje metody pro všechny operace s daty na rolích. Tato třída je ekvivalentní třídě RoleStore<TRole> v oboru názvů Microsoft.ASP.NET.Identity.EntityFramework. Ve třídě RoleStore implementujete IRoleStore<TRole, TKey> a volitelně IQueryableRoleStore<TRole, TKey> rozhraní.

Obrázek znázorňující třídu úložiště rolí

Následující příklad ukazuje třídu úložiště rolí. Obecný parametr TRole přebírá typ vaší třídy role, což je obvykle třída IdentityRole, kterou jste definovali. Obecný parametr TKey přebírá typ klíče role.

public class RoleStore : IRoleStore<IdentityRole, int>
{
    public RoleStore() { ... }
    public RoleStore(ExampleStorage database) { ... }
    public Task CreateAsync(IdentityRole role) { ... }
    public Task DeleteAsync(IdentityRole role) { ... }
    public Task<IdentityRole> FindByIdAsync(int roleId) { ... }
    public Task<IdentityRole> FindByNameAsync(string roleName) { ... }
    public Task UpdateAsync(IdentityRole role) { ... }
    public void Dispose() { ... }
}
  • IRoleStore<– role>
    Rozhraní IRoleStore definuje metody, které se mají implementovat ve třídě úložiště rolí. Obsahuje metody pro vytváření, aktualizaci, odstraňování a načítání rolí.

  • RoleStore<role>
    Chcete-li přizpůsobit RoleStore, vytvořte třídu, která implementuje rozhraní IRoleStore. Tuto třídu musíte implementovat pouze v případě, že chcete ve vašem systému používat role. Konstruktor, který přebírá parametr s názvem databáze typu ExampleDatabase, je pouze ilustrací toho, jak předat třídu přístupu k datům. Například v implementaci MySQL tento konstruktor přebírá parametr typu MySQLDatabase.

    Úplnou implementaci najdete v tématu RoleStore (MySQL) .

Změna konfigurace aplikace tak, aby používala nového zprostředkovatele úložiště

Implementovali jste nového poskytovatele úložiště. Teď musíte aplikaci nakonfigurovat tak, aby používala tohoto zprostředkovatele úložiště. Pokud byl do projektu zahrnut výchozí poskytovatel úložiště, musíte výchozího poskytovatele odebrat a nahradit ho vaším poskytovatelem.

Nahrazení výchozího poskytovatele úložiště v projektu MVC

  1. V okně Spravovat balíčky NuGet odinstalujte balíček Microsoft ASP.NET Identity EntityFramework . Tento balíček najdete vyhledáním identity.EntityFramework v nainstalovaných balíčcích.
    Obrázek okna Nu Get packages Zobrazí se dotaz, jestli chcete také odinstalovat Entity Framework. Pokud ho nepotřebujete v jiných částech aplikace, můžete ho odinstalovat.

  2. V souboru IdentityModels.cs ve složce Models odstraňte nebo zakomentujte třídy ApplicationUser a ApplicationDbContext . V aplikaci MVC můžete odstranit celý soubor IdentityModels.cs. V aplikaci Web Forms odstraňte tyto dvě třídy, ale ujistěte se, že jste zachovali pomocnou třídu, která je také umístěna v souboru IdentityModels.cs.

  3. Pokud se váš poskytovatel úložiště nachází v samostatném projektu, přidejte na něj ve webové aplikaci odkaz.

  4. Nahraďte všechny odkazy using Microsoft.AspNet.Identity.EntityFramework; příkazem using pro obor názvů vašeho poskytovatele úložiště.

  5. Ve třídě Startup.Auth.cs změňte metodu ConfigureAuth tak, aby používala jednu instanci příslušného kontextu.

    public void ConfigureAuth(IAppBuilder app)
    {
        app.CreatePerOwinContext(ExampleStorageContext.Create);
        app.CreatePerOwinContext(ApplicationUserManager.Create);
        ...
    
  6. Ve složce App_Start otevřete Soubor IdentityConfig.cs. Ve třídě ApplicationUserManager změňte metodu Create tak, aby vrátila správce uživatelů, který používá vaše přizpůsobené úložiště uživatelů.

    public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
    {
        var manager = new ApplicationUserManager(new UserStore(context.Get<ExampleStorageContext>()));
        ...
    }
    
  7. Nahraďte všechny odkazy na ApplicationUserparametrem IdentityUser.

  8. Výchozí projekt zahrnuje některé členy v uživatelské třídě, které nejsou definovány v rozhraní IUser; například Email, PasswordHash a GenerateUserIdentityAsync. Pokud vaše třída uživatele nemá tyto členy, musíte je buď implementovat, nebo změnit kód, který používá tyto členy.

  9. Pokud jste vytvořili nějaké instance RoleManager, změňte tento kód tak, aby používal novou třídu RoleStore.

    var roleManager = new RoleManager<IdentityRole>(new RoleStore(context.Get<ExampleStorageContext>()));
    
  10. Výchozí projekt je určen pro třídu uživatele, která má řetězcovou hodnotu pro klíč. Pokud má vaše třída uživatele jiný typ klíče (například celé číslo), musíte projekt změnit tak, aby fungoval s vaším typem. Viz Změna primárního klíče pro uživatele v ASP.NET Identity.

  11. V případě potřeby přidejte připojovací řetězec do souboru Web.config.

Další prostředky