Omówienie niestandardowych dostawców magazynu dla systemu ASP.NET Identity

Autor FitzMacken

ASP.NET Identity to rozszerzalny system, który umożliwia utworzenie własnego dostawcy magazynu i podłączenie go do aplikacji bez konieczności ponownego pracy aplikacji. W tym temacie opisano sposób tworzenia niestandardowego dostawcy magazynu dla ASP.NET Identity. Obejmuje to ważne koncepcje tworzenia własnego dostawcy magazynu, ale nie jest to przewodnik krok po kroku dotyczący wdrażania niestandardowego dostawcy magazynu.

Przykład implementacji niestandardowego dostawcy magazynu znajduje się w temacie implementacja niestandardowego dostawcy magazynu ASP.NET Identity MySQL.

Ten temat został zaktualizowany dla ASP.NET Identity 2,0.

Wersje oprogramowania używane w samouczku

  • Visual Studio 2013 z aktualizacją Update 2
  • ASP.NET Identity 2

Wprowadzenie

Domyślnie system ASP.NET Identity przechowuje informacje o użytkowniku w SQL Server bazie danych, a następnie tworzy bazę danych przy użyciu Code First Entity Framework. W przypadku wielu aplikacji to podejście działa prawidłowo. Jednak warto użyć innego typu mechanizmu trwałości, takiego jak Azure Table Storage lub już istnieją tabele bazy danych z bardzo inną strukturą niż domyślna implementacja. W obu przypadkach można napisać niestandardowego dostawcę dla mechanizmu magazynu i podłączyć go do aplikacji.

ASP.NET Identity jest uwzględniany domyślnie w wielu Visual Studio 2013 szablonach. Aktualizacje do ASP.NET Identity można uzyskać przy użyciu pakietu NuGet Microsoft ASPNET Identity EntityFramework.

Ten temat zawiera następujące sekcje:

Omówienie architektury

ASP.NET Identity składa się z klas o nazwie menedżerowie i sklepy. Menedżerowie są klasami wysokiego poziomu, których deweloperzy aplikacji używają do wykonywania operacji, takich jak tworzenie użytkownika w systemie ASP.NET Identity. Magazyny są klasy niższego poziomu, które określają, jak są utrwalane jednostki, takie jak użytkownicy i role. Magazyny są ściśle powiązane z mechanizmem trwałości, ale menedżerowie są niepołączeni z magazynów, co oznacza, że można zastąpić mechanizm trwałości bez zakłócania całej aplikacji.

Na poniższym diagramie przedstawiono, w jaki sposób aplikacja sieci Web współdziała z menedżerami, i przechowuje interakcję z warstwą dostępu do danych.

Aby utworzyć niestandardowego dostawcę magazynu dla ASP.NET Identity, należy utworzyć źródło danych, warstwę dostępu do danych i klasy magazynu, które współpracują z tą warstwą dostępu do danych. Można nadal używać tych samych interfejsów API Menedżera do wykonywania operacji na danych użytkownika, ale teraz dane są zapisywane w innym systemie magazynu.

Nie trzeba dostosowywać klas Menedżera, ponieważ podczas tworzenia nowego wystąpienia elementu Usermanager lub roleManager udostępniasz typ klasy użytkownika i przekazujesz wystąpienie klasy magazynu jako argument. Takie podejście umożliwia podłączenie niestandardowych klas do istniejącej struktury. Zobaczysz, jak utworzyć wystąpienie klasy Usermanager i roleManager przy użyciu dostosowanych klas magazynu w sekcji Zmień konfigurację aplikacji tak, aby korzystała z nowego dostawcy magazynu.

Zrozumienie przechowywanych danych

Aby zaimplementować niestandardowego dostawcę magazynu, należy zrozumieć typy danych używanych w ASP.NET Identity i zdecydować, które funkcje są odpowiednie dla aplikacji.

Dane Opis
Użytkownicy Zarejestrowani użytkownicy witryny sieci Web. Zawiera identyfikator użytkownika i nazwę użytkownika. Może zawierać skrót hasła, jeśli użytkownicy logują się przy użyciu poświadczeń specyficznych dla danej lokacji (zamiast używać poświadczeń z witryny zewnętrznej, takiej jak Facebook) i sygnatury zabezpieczeń, aby wskazać, czy wszystkie zmiany w poświadczeniach użytkownika zostały zmienione. Może również zawierać adres e-mail, numer telefonu, czy włączone jest uwierzytelnianie dwuskładnikowe, bieżącą liczbę nieudanych logowań oraz czy konto zostało zablokowane.
Oświadczenia użytkowników Zestaw instrukcji (lub oświadczeń) o użytkowniku, który reprezentuje tożsamość użytkownika. Można włączyć lepsze wyrażenie tożsamości użytkownika, niż można osiągnąć za pomocą ról.
Logowania użytkowników Informacje o zewnętrznym dostawcy uwierzytelniania (na przykład Facebook) do użycia podczas logowania użytkownika.
Role Grupy autoryzacji dla witryny. Zawiera identyfikator roli i nazwę roli (na przykład "admin" lub "Employee").

Tworzenie warstwy dostępu do danych

W tym temacie założono, że znasz mechanizm trwałości, który ma być używany, oraz sposób tworzenia jednostek dla tego mechanizmu. Ten temat nie zawiera szczegółowych informacji o sposobie tworzenia repozytoriów lub klas dostępu do danych; Zamiast tego zawiera pewne sugestie dotyczące decyzji projektowych, które należy podjąć podczas pracy z ASP.NET Identity.

Podczas projektowania repozytoriów dla niestandardowego dostawcy magazynu istnieje dużo swobody. Dla funkcji, które mają być używane w aplikacji, wystarczy utworzyć repozytoria. Na przykład, jeśli nie używasz ról w aplikacji, nie musisz tworzyć magazynu dla ról lub ról użytkownika. Twoja technologia i istniejąca infrastruktura mogą wymagać struktury, która różni się od domyślnej implementacji ASP.NET Identity. W warstwie dostępu do danych można zapewnić logikę do pracy ze strukturą repozytoriów.

Aby uzyskać implementację repozytoriów danych programu MySQL dla ASP.NET Identity 2,0, zobacz MySQLIdentity. SQL.

W warstwie dostępu do danych można zapewnić logikę, aby zapisać dane z ASP.NET Identity ze źródłem danych. Warstwa dostępu do danych dla niestandardowego dostawcy magazynu może zawierać następujące klasy służące do przechowywania informacji o użytkowniku i roli.

Klasa Opis Przykład
Kontekst Hermetyzuje informacje w celu nawiązania połączenia z mechanizmem trwałości i wykonywania zapytań. Ta klasa jest centralną warstwą dostępu do danych. Inne klasy danych będą wymagały wystąpienia tej klasy do wykonywania ich operacji. Należy również zainicjować klasy magazynu przy użyciu wystąpienia tej klasy. MySQLDatabase
Magazyn użytkowników Przechowuje i pobiera informacje o użytkowniku (takie jak nazwa użytkownika i skrót hasła). Użytkownik (MySQL)
Magazyn ról Przechowuje i pobiera informacje o rolach (takie jak nazwa roli). Roleing (MySQL)
Magazyn UserClaims Przechowuje i pobiera informacje o użytkowniku (takie jak typ i wartość żądania). UserClaimsTable (MySQL)
Magazyn UserLogins Przechowuje i pobiera informacje logowania użytkownika (na przykład zewnętrzny dostawca uwierzytelniania). UserLoginsTable (MySQL)
Przestrzeń dyskowa UserRole Przechowuje i pobiera role, do których użytkownik jest przypisany. UserRoleTable (MySQL)

Ponownie wystarczy zaimplementować klasy, które mają być używane w aplikacji.

W klasach dostępu do danych dostarcza się kod służący do wykonywania operacji na danych dla określonego mechanizmu trwałości. Na przykład w ramach implementacji programu MySQL Klasa users zawiera metodę wstawiania nowego rekordu do tabeli bazy danych użytkowników. Zmienna o nazwie _database jest wystąpieniem klasy MySQLDatabase.

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 utworzeniu klas dostępu do danych należy utworzyć klasy magazynu, które wywołują konkretne metody z warstwy dostępu do danych.

Dostosowywanie klasy użytkownika

Podczas wdrażania własnego dostawcy magazynu należy utworzyć klasę użytkownika, która jest równoważna z klasą IdentityUser w przestrzeni nazw Microsoft. ASP. NET. Identity. EntityFramework :

Na poniższym diagramie przedstawiono klasę IdentityUser, którą należy utworzyć, oraz interfejs do zaimplementowania w tej klasie.

Interfejs IUser<TKey> definiuje właściwości, które użytkownikmanager próbuje wywołać podczas wykonywania żądanych operacji. Interfejs zawiera dwie właściwości — ID i UserName. Interfejs IUser<TKey> umożliwia określenie typu klucza użytkownika za pomocą ogólnego parametru TKey . Typ właściwości ID pasuje do wartości parametru TKey.

Program Identity Framework udostępnia również interfejs IUser (bez parametru generycznego), jeśli chcesz użyć wartości ciągu dla klucza.

Klasa IdentityUser implementuje IUser i zawiera wszelkie dodatkowe właściwości lub konstruktorów dla użytkowników w witrynie sieci Web. W poniższym przykładzie pokazano klasę IdentityUser, która używa wartości całkowitej dla klucza. Pole ID ma wartość int , aby odpowiadało wartości parametru generycznego.

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
}

Aby uzyskać kompletną implementację, zobacz IdentityUser (MySQL).

Dostosowywanie magazynu użytkowników

Utworzysz również klasę UserStore, która dostarcza metody dla wszystkich operacji na danych użytkownika. Ta klasa jest równoważna z klasą UserStore<TUser> w przestrzeni nazw Microsoft. ASP. NET. Identity. EntityFramework . W klasie UserStore zaimplementowano IUserStore<TUser, TKey> i wszystkie opcjonalne interfejsy. Należy wybrać opcjonalne interfejsy do wdrożenia na podstawie funkcji, które mają być używane w aplikacji.

Na poniższej ilustracji przedstawiono klasę UserStore, która musi zostać utworzona, oraz odpowiednie interfejsy.

Domyślny szablon projektu w programie Visual Studio zawiera kod, który zakłada, że wiele opcjonalnych interfejsów zostało zaimplementowanych w magazynie użytkownika. Jeśli używasz szablonu domyślnego z niestandardowym magazynem użytkowników, musisz zaimplementować opcjonalne interfejsy w magazynie użytkownika lub zmienić kod szablonu, aby nie wywoływać metod w interfejsach, które nie zostały zaimplementowane.

Poniższy przykład pokazuje prostą klasę magazynu użytkownika. Parametr generyczny TUser Pobiera typ klasy użytkownika, która jest zwykle klasą IdentityUser, która została zdefiniowana. Parametr generyczny TKey Pobiera typ klucza użytkownika.

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() { ... }
}

W tym przykładzie Konstruktor, który pobiera parametr o nazwie baza danych typu ExampleDatabase, jest tylko ilustracją, jak przekazać do klasy dostępu do danych. Na przykład w implementacji programu MySQL ten Konstruktor przyjmuje parametr typu MySQLDatabase.

W klasie UserStore używane są klasy dostępu do danych, które zostały utworzone w celu wykonywania operacji. Na przykład w implementacji programu MySQL Klasa UserStore ma metodę UtwórzRekord, która używa wystąpienia obiektu użytkownika, aby wstawić nowy rekord. Metoda INSERT dla obiektu userion jest taka sama jak metoda, która została pokazana w poprzedniej sekcji.

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

    userTable.Insert(user);

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

Interfejsy do wdrożenia podczas dostosowywania magazynu użytkownika

Na następnym obrazie przedstawiono szczegółowe informacje o funkcjach zdefiniowanych w poszczególnych interfejsach. Wszystkie opcjonalne interfejsy dziedziczą z IUserStore.

  • IUserStore
    Interfejs IUserStore<TUser, TKey> jest interfejsem, który należy zaimplementować w magazynie użytkownika. Definiuje on metody tworzenia, aktualizowania, usuwania i pobierania użytkowników.

  • IUserClaimStore
    IUserClaimStore<TUser, TKey interfejs> definiuje metody, które należy zaimplementować w magazynie użytkownika, aby umożliwić oświadczenia użytkowników. Zawiera ona metody lub Dodawanie, usuwanie i pobieranie oświadczeń użytkowników.

  • IUserLoginStore
    IUserLoginStore<TUser, TKey> definiuje metody, które należy zaimplementować w magazynie użytkownika, aby umożliwić zewnętrznym dostawcom uwierzytelniania. Zawiera metody dodawania, usuwania i pobierania identyfikatorów logowania użytkowników oraz metoda pobierania użytkownika na podstawie informacji logowania.

  • IUserRoleStore
    IUserRoleStore<TKey, TUser interfejs> definiuje metody, które należy zaimplementować w magazynie użytkownika, aby zamapować użytkownika na rolę. Zawiera on metody dodawania, usuwania i pobierania ról użytkownika oraz metodę sprawdzania, czy użytkownik jest przypisany do roli.

  • IUserPasswordStore
    IUserPasswordStore<TUser, TKey interfejs> definiuje metody, które należy zaimplementować w magazynie użytkownika, aby utrwalać hasła z mieszaniem. Zawiera on metody pobierania i ustawiania skrótu hasła oraz metodę, która wskazuje, czy użytkownik ustawił hasło.

  • IUserSecurityStampStore
    IUserSecurityStampStore<TUser, TKey interfejs> definiuje metody, które należy zaimplementować w magazynie użytkownika, aby można było określić, czy informacje o koncie użytkownika zostały zmienione. Ta sygnatura jest aktualizowana, gdy użytkownik zmienia hasło lub dodaje lub usuwa logowania. Zawiera on metody pobierania i ustawiania sygnatury zabezpieczeń.

  • IUserTwoFactorStore
    IUserTwoFactorStore<TUser, TKey interfejs> definiuje metody, które należy zaimplementować w celu wdrożenia uwierzytelniania dwuskładnikowego. Zawiera on metody umożliwiające pobieranie i określanie, czy uwierzytelnianie dwuskładnikowe jest włączone dla użytkownika.

  • IUserPhoneNumberStore
    IUserPhoneNumberStore<TUser, TKey interfejs> definiuje metody, które należy zaimplementować w celu przechowywania numerów telefonów użytkowników. Zawiera on metody pobierania i ustawiania numeru telefonu oraz tego, czy numer telefonu został potwierdzony.

  • IUserEmailStore
    IUserEmailStore<TUser, TKey interfejs> definiuje metody, które należy zaimplementować, aby przechowywać adresy e-mail użytkowników. Zawiera on metody pobierania i ustawiania adresu e-mail oraz tego, czy wiadomość e-mail została potwierdzona.

  • IUserLockoutStore
    IUserLockoutStore<TUser, TKey interfejs> definiuje metody, które należy zaimplementować, aby przechowywać informacje o blokowaniu konta. Zawiera metody pobierania bieżącej liczby nieudanych prób dostępu, uzyskiwania i określania, czy konto może być zablokowane, pobieranie i Ustawianie daty zakończenia blokady, zwiększanie liczby nieudanych prób i resetowanie liczby nieudanych prób.

  • IQueryableUserStore
    IQueryableUserStore<TUser, TKey interfejs> definiuje elementy członkowskie, które należy zaimplementować, aby zapewnić magazyn użytkowników queryable. Zawiera właściwość, która posiada użytkowników queryable.

    Należy zaimplementować interfejsy, które są potrzebne w aplikacji; takie jak, IUserClaimStore, IUserLoginStore, IUserRoleStore, IUserPasswordStore i IUserSecurityStampStore, jak pokazano poniżej.

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
}

Aby uzyskać pełną implementację (w tym wszystkie interfejsy), zobacz UserStore (MySQL).

IdentityUserClaim, IdentityUserLogin i IdentityUserRole

Przestrzeń nazw Microsoft. AspNet. Identity. EntityFramework zawiera implementacje klas IdentityUserClaim, IdentityUserLogini IdentityUserRole . Jeśli używasz tych funkcji, możesz chcieć utworzyć własne wersje tych klas i zdefiniować właściwości aplikacji. Czasami jednak bardziej wydajne jest, aby nie ładować tych jednostek do pamięci podczas wykonywania podstawowych operacji (takich jak dodawanie lub usuwanie roszczeń użytkownika). Zamiast tego klasy magazynu zaplecza mogą wykonywać te operacje bezpośrednio w źródle danych. Na przykład Metoda UserStore. GetClaimsAsync () może wywołać userClaimTable. FindByUserId (użytkownika. ID) metoda umożliwiająca bezpośrednie wykonanie zapytania w tej tabeli i zwrócenie listy oświadczeń.

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

Dostosowywanie klasy roli

Podczas implementowania własnego dostawcy magazynu należy utworzyć klasę roli, która jest równoważna z klasą IdentityRole w przestrzeni nazw Microsoft. ASP. NET. Identity. EntityFramework :

Na poniższym diagramie przedstawiono klasę IdentityRole, którą należy utworzyć, oraz interfejs do zaimplementowania w tej klasie.

Interfejs IRole<TKey> definiuje właściwości, które są podejmowane przez rolęmanager podczas wykonywania żądanych operacji. Interfejs zawiera dwie właściwości-ID i Name. Interfejs IRole<TKey> umożliwia określenie typu klucza dla roli za pomocą ogólnego parametru TKey . Typ właściwości ID pasuje do wartości parametru TKey.

Program Identity Framework udostępnia również interfejs IRole (bez parametru generycznego), jeśli chcesz użyć wartości ciągu dla klucza.

W poniższym przykładzie pokazano klasę IdentityRole, która używa wartości całkowitej dla klucza. Pole ID ma wartość int, aby odpowiadało wartości parametru generycznego.

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

Aby uzyskać kompletną implementację, zobacz IdentityRole (MySQL).

Dostosowywanie magazynu ról

Utworzysz również klasę RoleStore, która dostarcza metody dla wszystkich operacji na danych na rolach. Ta klasa jest równoważna z klasą RoleStore<TRole> w przestrzeni nazw Microsoft. ASP. NET. Identity. EntityFramework. W klasie RoleStore zaimplementowano IRoleStore<TRole, TKey> i opcjonalnie IQueryableRoleStore<TRole, TKey> interfejs.

Poniższy przykład przedstawia klasę magazynu ról. Parametr generyczny TRole Pobiera typ klasy roli, która jest zwykle klasą IdentityRole, która została zdefiniowana. Parametr generyczny TKey Pobiera typ klucza roli.

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<TRole>
    Interfejs IRoleStore definiuje metody do zaimplementowania w klasie magazynu ról. Zawiera metody tworzenia, aktualizowania, usuwania i pobierania ról.

  • RoleStore<TRole>
    Aby dostosować RoleStore, należy utworzyć klasę, która implementuje interfejs IRoleStore. Musisz zaimplementować tę klasę tylko, jeśli chcesz używać ról w systemie. Konstruktor, który pobiera parametr o nazwie baza danych typu ExampleDatabase, jest tylko ilustracją, jak przekazać do klasy dostępu do danych. Na przykład w implementacji programu MySQL ten Konstruktor przyjmuje parametr typu MySQLDatabase.

    Aby uzyskać kompletną implementację, zobacz RoleStore (MySQL) .

Zmień konfigurację aplikacji tak, aby korzystała z nowego dostawcy magazynu

Nowy dostawca magazynu został zaimplementowany. Teraz musisz skonfigurować aplikację do korzystania z tego dostawcy magazynu. Jeśli domyślny dostawca magazynu został uwzględniony w projekcie, należy usunąć domyślnego dostawcę i zamienić go na dostawcę.

Zastąp domyślnego dostawcę magazynu w projekcie MVC

  1. W oknie Zarządzanie pakietami NuGet odinstaluj pakiet Microsoft ASP.NET Identity EntityFramework . Ten pakiet można znaleźć, wyszukując w zainstalowanych pakietach Identity. EntityFramework.
    zostanie wyświetlony monit, jeśli chcesz również odinstalować Entity Framework. Jeśli nie potrzebujesz go w innych częściach aplikacji, możesz go odinstalować.

  2. W pliku IdentityModels.cs w folderze models Usuń lub Skomentuj klasy ApplicationUser i ApplicationDbContext . W aplikacji MVC można usunąć cały plik IdentityModels.cs. W aplikacji formularzy sieci Web Usuń dwie klasy, ale upewnij się, że utrzymujesz klasę pomocnika, która znajduje się również w pliku IdentityModels.cs.

  3. Jeśli Twój dostawca magazynu znajduje się w osobnym projekcie, Dodaj odwołanie do niego w aplikacji sieci Web.

  4. Zastąp wszystkie odwołania do using Microsoft.AspNet.Identity.EntityFramework; za pomocą instrukcji using dla przestrzeni nazw dostawcy magazynu.

  5. W klasie Startup.auth.cs Zmień metodę ConfigureAuth , tak aby korzystała z jednego wystąpienia odpowiedniego kontekstu.

    public void ConfigureAuth(IAppBuilder app)
    {
        app.CreatePerOwinContext(ExampleStorageContext.Create);
        app.CreatePerOwinContext(ApplicationUserManager.Create);
        ...
    
  6. W folderze Start_aplikacji Otwórz IdentityConfig.cs. W klasie ApplicationUserManager Zmień metodę Create , aby zwracała Menedżera użytkowników, który korzysta z niestandardowego magazynu użytkownika.

    public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
    {
        var manager = new ApplicationUserManager(new UserStore(context.Get<ExampleStorageContext>()));
        ...
    }
    
  7. Zastąp wszystkie odwołania do ApplicationUser z IdentityUser.

  8. Domyślny projekt zawiera niektóre elementy członkowskie klasy użytkownika, które nie są zdefiniowane w interfejsie IUser; takie jak Poczta E-mail, PasswordHash i GenerateUserIdentityAsync. Jeśli klasa użytkownika nie ma tych elementów członkowskich, należy wdrożyć je lub zmienić kod, który używa tych elementów członkowskich.

  9. Jeśli utworzono wystąpienia elementu roleManager, Zmień ten kod, aby użyć nowej klasy RoleStore.

    var roleManager = new RoleManager<IdentityRole>(new RoleStore(context.Get<ExampleStorageContext>()));
    
  10. Projekt domyślny został zaprojektowany dla klasy użytkownika, która ma wartość ciągu dla klucza. Jeśli klasa użytkownika ma inny typ klucza (na przykład liczba całkowita), należy zmienić projekt, aby współpracował z typem. Zobacz Zmień klucz podstawowy dla użytkowników w ASP.NET Identity.

  11. W razie potrzeby Dodaj parametry połączenia do pliku Web. config.

Inne zasoby