Udostępnij za pośrednictwem


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

– autor Tom FitzMacken

ASP.NET Identity to rozszerzalny system, który umożliwia tworzenie własnego dostawcy magazynu i podłączanie go do aplikacji bez ponownego działania aplikacji. W tym temacie opisano sposób tworzenia dostosowanego dostawcy magazynu dla usługi ASP.NET Identity. Obejmuje ona ważne pojęcia dotyczące tworzenia własnego dostawcy magazynu, ale nie jest to szczegółowy przewodnik wdrażania niestandardowego dostawcy magazynu.

Przykład implementowania niestandardowego dostawcy magazynu można znaleźć w temacie Implementowanie niestandardowego dostawcy magazynu tożsamości mySQL ASP.NET.

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 bazie danych SQL Server i używa programu Entity Framework Code First do utworzenia bazy danych. W przypadku wielu aplikacji takie podejście działa dobrze. Jednak wolisz użyć innego typu mechanizmu trwałości, takiego jak usługa Azure Table Storage, lub tabele baz danych z zupełnie inną strukturą niż domyślna implementacja. W obu przypadkach możesz napisać dostosowanego dostawcę dla mechanizmu magazynu i podłączyć tego dostawcę do aplikacji.

ASP.NET Tożsamość jest domyślnie uwzględniana w wielu szablonach Visual Studio 2013. Aktualizacje tożsamości ASP.NET można uzyskać za pośrednictwem pakietu NuGet Microsoft AspNet Identity EntityFramework.

Ten temat zawiera następujące sekcje:

Omówienie architektury

ASP.NET Identity składa się z klas nazywanych menedżerami i magazynami. Menedżerowie to klasy wysokiego poziomu, których deweloper aplikacji używa do wykonywania operacji, takich jak tworzenie użytkownika, w systemie ASP.NET Identity. Magazyny to klasy niższego poziomu, które określają sposób utrwalania jednostek, takich jak użytkownicy i role. Magazyny są ściśle powiązane z mechanizmem trwałości, ale menedżerowie są oddzieleni od sklepów, co oznacza, że można zastąpić mechanizm trwałości bez zakłócania całej aplikacji.

Na poniższym diagramie pokazano, jak aplikacja internetowa współdziała z menedżerami i przechowuje interakcje z warstwą dostępu do danych.

Diagram przedstawiający sposób interakcji aplikacji internetowej z menedżerami

Aby utworzyć dostosowanego dostawcę magazynu dla usługi ASP.NET Identity, musisz utworzyć źródło danych, warstwę dostępu do danych i klasy magazynu, które współdziałają z tą warstwą dostępu do danych. Możesz nadal używać tych samych interfejsów API menedżera do wykonywania operacji danych na użytkowniku, ale teraz dane są zapisywane w innym systemie magazynu.

Nie trzeba dostosowywać klas menedżera, ponieważ podczas tworzenia nowego wystąpienia klasy UserManager lub RoleManager należy podać typ klasy użytkownika i przekazać wystąpienie klasy store jako argument. Takie podejście umożliwia podłączanie dostosowanych klas do istniejącej struktury. Zobaczysz, jak utworzyć wystąpienie klasy UserManager i RoleManager przy użyciu dostosowanych klas sklepów w sekcji Reconfigure application to use new storage provider (Ponowne konfigurowanie aplikacji w celu korzystania z nowego dostawcy magazynu).

Informacje o przechowywanych danych

Aby zaimplementować niestandardowego dostawcę magazynu, musisz zrozumieć typy danych używanych z usługą ASP.NET Identity i zdecydować, które funkcje są istotne dla aplikacji.

Dane Opis
Użytkownicy Zarejestrowani użytkownicy witryny sieci Web. Zawiera identyfikator użytkownika i nazwę użytkownika. Może zawierać hasło skrótu, jeśli użytkownicy logują się przy użyciu poświadczeń specyficznych dla witryny (zamiast używać poświadczeń z witryny zewnętrznej, takiej jak Facebook), oraz sygnatury zabezpieczeń, aby wskazać, czy coś się zmieniło w poświadczeniach użytkownika. Może również obejmować adres e-mail, numer telefonu, czy włączono uwierzytelnianie dwuskładnikowe, bieżącą liczbę nieudanych logowań i czy konto zostało zablokowane.
Oświadczenia użytkownika Zestaw instrukcji (lub oświadczeń) dotyczących użytkownika, który reprezentuje tożsamość użytkownika. Może włączyć większe wyrażenie tożsamości użytkownika, niż można osiągnąć za pomocą ról.
Identyfikatory 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 "Administracja" lub "Pracownik").

Tworzenie warstwy dostępu do danych

W tym temacie założono, że znasz mechanizm trwałości, którego będziesz używać i jak tworzyć jednostki dla tego mechanizmu. Ten temat nie zawiera szczegółowych informacji na temat tworzenia repozytoriów ani klas dostępu do danych; Zamiast tego zawiera kilka sugestii dotyczących decyzji projektowych, które należy podjąć podczas pracy z usługą ASP.NET Identity.

Masz wiele swobody podczas projektowania repozytoriów dla dostosowanego dostawcy sklepu. Wystarczy utworzyć repozytoria dla funkcji, które mają być używane w aplikacji. Jeśli na przykład nie używasz ról w aplikacji, nie musisz tworzyć magazynu dla ról ani ról użytkowników. 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 udostępniasz logikę do pracy ze strukturą repozytoriów.

Aby zapoznać się z implementacją repozytoriów danych MySQL dla ASP.NET Identity 2.0, zobacz MySQLIdentity.sql.

W warstwie dostępu do danych należy podać logikę zapisywania danych z usługi ASP.NET Identity do źródła danych. Warstwa dostępu do danych dla dostosowanego dostawcy magazynu może zawierać następujące klasy do przechowywania informacji o użytkownikach i rolach.

Klasa Opis Przykład
Kontekst Hermetyzuje informacje w celu nawiązania połączenia z mechanizmem trwałości i wykonywania zapytań. Ta klasa jest centralna dla warstwy dostępu do danych. Inne klasy danych będą wymagać wystąpienia tej klasy w celu wykonania operacji. Zainicjujesz również klasy sklepów 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). UserTable (MySQL)
Magazyn ról Przechowuje i pobiera informacje o roli (takie jak nazwa roli). Tabela ról (MySQL)
UserClaims Storage Przechowuje i pobiera informacje o oświadczeniach użytkownika (takie jak typ oświadczenia i wartość). UserClaimsTable (MySQL)
Magazyn UserLogins Przechowuje i pobiera informacje logowania użytkownika (na przykład zewnętrznego dostawcy uwierzytelniania). UserLoginsTable (MySQL)
UserRole Storage Przechowuje i pobiera role przypisane do użytkownika. UserRoleTable (MySQL)

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

W klasach dostępu do danych należy podać kod umożliwiający wykonywanie operacji danych dla określonego mechanizmu trwałości. Na przykład w ramach implementacji mySQL klasa UserTable zawiera metodę wstawiania nowego rekordu do tabeli bazy danych Users. 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 wywołujące określone metody w warstwie dostępu do danych.

Dostosowywanie klasy użytkownika

Podczas implementowania własnego dostawcy magazynu należy utworzyć klasę użytkownika, która jest równoważna klasie 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.

Obraz klasy Identity User

Interfejs IUser<TKey> definiuje właściwości, które użytkownik UserManager próbuje wywołać podczas wykonywania żądanych operacji. Interfejs zawiera dwie właściwości — Identyfikator 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 jest zgodny z wartością parametru TKey.

Platforma Identity udostępnia również interfejs IUser (bez parametru ogólnego), gdy chcesz użyć wartości ciągu dla klucza.

Klasa IdentityUser implementuje IUser i zawiera wszelkie dodatkowe właściwości lub konstruktory dla użytkowników w witrynie sieci Web. W poniższym przykładzie przedstawiono klasę IdentityUser, która używa liczby całkowitej klucza. Pole Identyfikator jest ustawione na wartość int , aby było zgodne z wartością parametru ogólnego.

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ć pełną implementację, zobacz IdentityUser (MySQL).

Dostosowywanie magazynu użytkowników

Utworzysz również klasę UserStore, która udostępnia metody dla wszystkich operacji danych na użytkowniku. Ta klasa jest równoważna klasie UserStore<TUser> w przestrzeni nazw Microsoft.ASP.NET.Identity.EntityFramework . W klasie UserStore implementujesz interfejs IUserStore<TUser, TKey> i dowolny z opcjonalnych interfejsów. Wybierasz, które opcjonalne interfejsy mają zostać zaimplementowane na podstawie funkcjonalności, którą chcesz podać w aplikacji.

Na poniższej ilustracji przedstawiono klasę UserStore, którą należy utworzyć i odpowiednie interfejsy.

Obraz przedstawiający klasę Magazyn użytkowników

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żytkowników. Jeśli używasz szablonu domyślnego z dostosowanym magazynem użytkowników, musisz zaimplementować opcjonalne interfejsy w sklepie użytkownika lub zmienić kod szablonu, aby nie wywoływać już metod w interfejsach, które nie zostały zaimplementowane.

W poniższym przykładzie przedstawiono prostą klasę magazynu użytkowników. Parametr ogólny TUser przyjmuje typ klasy użytkownika, który zwykle jest zdefiniowaną klasą IdentityUser. Ogólny parametr TKey przyjmuje 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 przyjmuje parametr o nazwie baza danych typu ExampleDatabase, jest tylko ilustracją sposobu przekazywania w klasie dostępu do danych. Na przykład w implementacji mySQL ten konstruktor przyjmuje parametr typu MySQLDatabase.

W klasie UserStore używasz klas dostępu do danych utworzonych do wykonywania operacji. Na przykład w implementacji mySQL klasa UserStore ma metodę CreateAsync, która używa wystąpienia elementu UserTable do wstawiania nowego rekordu. Metoda Insert w obiekcie userTable jest tą samą metodą, 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 zaimplementowania podczas dostosowywania magazynu użytkowników

Na następnym obrazie przedstawiono więcej szczegółów dotyczących funkcji zdefiniowanych w każdym interfejsie. Wszystkie opcjonalne interfejsy dziedziczą z magazynu IUserStore.

Ilustracja przedstawiająca więcej szczegółów dotyczących funkcji zdefiniowanych w każdym interfejsie

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

  • IUserClaimStore
    Interfejs IUserClaimStore<TUser, TKey> definiuje metody, które należy zaimplementować w magazynie użytkowników, aby włączyć oświadczenia użytkownika. Zawiera metody lub dodawanie, usuwanie i pobieranie oświadczeń użytkownika.

  • IUserLoginStore
    IUserLoginStore<TUser, TKey> definiuje metody, które należy zaimplementować w magazynie użytkowników, aby włączyć zewnętrznych dostawców uwierzytelniania. Zawiera metody dodawania, usuwania i pobierania identyfikatorów logowania użytkownika oraz metody pobierania użytkownika na podstawie informacji logowania.

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

  • IUserPasswordStore
    Interfejs IUserPasswordStore<TUser, TKey> definiuje metody, które należy zaimplementować w magazynie użytkownika, aby utrwalić skróty haseł. Zawiera metody pobierania i ustawiania skrótu hasła oraz metody wskazującej, czy użytkownik ustawił hasło.

  • IUserSecurityStampStore
    Interfejs IUserSecurityStampStore<TUser, TKey> definiuje metody, które należy zaimplementować w magazynie użytkownika, aby użyć sygnatury zabezpieczeń, aby wskazać, czy informacje o koncie użytkownika uległy zmianie. Ta sygnatura jest aktualizowana, gdy użytkownik zmienia hasło lub dodaje lub usuwa identyfikatory logowania. Zawiera metody pobierania i ustawiania sygnatury zabezpieczeń.

  • IUserTwoFactorStore
    Interfejs IUserTwoFactorStore<TUser, TKey> definiuje metody, które należy zaimplementować w celu zaimplementowania uwierzytelniania dwuskładnikowego. Zawiera metody pobierania i ustawiania, czy dla użytkownika włączono uwierzytelnianie dwuskładnikowe.

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

  • IUserEmailStore
    Interfejs IUserEmailStore<TUser, TKey> definiuje metody, które należy zaimplementować do przechowywania adresów e-mail użytkownika. Zawiera metody pobierania i ustawiania adresu e-mail oraz potwierdzania wiadomości e-mail.

  • IUserLockoutStore
    Interfejs IUserLockoutStore<TUser, TKey> definiuje metody, które należy zaimplementować w celu przechowywania informacji na temat blokowania konta. Zawiera metody pobierania bieżącej liczby nieudanych prób dostępu, pobierania i ustawiania, 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
    Interfejs IQueryableUserStore<TUser, TKey> definiuje elementy członkowskie, które należy zaimplementować, aby zapewnić magazyn użytkowników z możliwością wykonywania zapytań. Zawiera właściwość, która przechowuje zapytalnych użytkowników.

    Zaimplementujesz interfejsy potrzebne w aplikacji; takich jak interfejsy 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, IdentityUserLogin i IdentityUserRole . Jeśli używasz tych funkcji, możesz utworzyć własne wersje tych klas i zdefiniować właściwości aplikacji. Jednak czasami wydajniejsze jest, aby nie ładować tych jednostek do pamięci podczas wykonywania podstawowych operacji (takich jak dodawanie lub usuwanie oświadczenia 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ć metodę userClaimTable.FindByUserId(user). Id) metoda wykonywania zapytania bezpośrednio w tej tabeli i zwracania 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 równoważną klasie 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.

Obraz przedstawiający klasę Rola tożsamości

Interfejs IRole<TKey> definiuje właściwości, które rolaManager próbuje wywołać podczas wykonywania żądanych operacji. Interfejs zawiera dwie właściwości — Identyfikator i Nazwa. Interfejs IRole<TKey> umożliwia określenie typu klucza dla roli za pomocą ogólnego parametru TKey . Typ właściwości Id jest zgodny z wartością parametru TKey.

Platforma Identity udostępnia również interfejs IRole (bez parametru ogólnego), gdy chcesz użyć wartości ciągu dla klucza.

W poniższym przykładzie przedstawiono klasę IdentityRole, która używa liczby całkowitej dla klucza. Pole Identyfikator jest ustawione na wartość int, aby było zgodne z wartością parametru ogólnego.

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

Aby uzyskać pełną implementację, zobacz IdentityRole (MySQL).

Dostosowywanie magazynu ról

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

Obraz przedstawiający klasę magazynu ról

W poniższym przykładzie przedstawiono klasę magazynu ról. Parametr ogólny TRole przyjmuje typ klasy roli, która zwykle jest zdefiniowaną klasą IdentityRole. Parametr ogólny TKey przyjmuje 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 implementowania w klasie magazynu ról. Zawiera metody tworzenia, aktualizowania, usuwania i pobierania ról.

  • RoleStore<TRole>
    Aby dostosować magazyn ról, utwórz klasę, która implementuje interfejs IRoleStore. Musisz zaimplementować tę klasę tylko wtedy, gdy chcesz używać ról w systemie. Konstruktor, który przyjmuje parametr o nazwie baza danych typu ExampleDatabase, jest tylko ilustracją sposobu przekazywania w klasie dostępu do danych. Na przykład w implementacji mySQL ten konstruktor przyjmuje parametr typu MySQLDatabase.

    Aby uzyskać pełną implementację, zobacz RoleStore (MySQL) .

Ponowne konfigurowanie aplikacji w celu korzystania z nowego dostawcy magazynu

Zaimplementowano nowego dostawcę magazynu. Teraz musisz skonfigurować aplikację tak, aby korzystała z tego dostawcy magazynu. Jeśli domyślny dostawca magazynu został uwzględniony w projekcie, musisz usunąć dostawcę domyślnego i zastąpić go dostawcą.

Zastępowanie domyślnego dostawcy 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.
    Obraz przedstawiający okno Pakietów Nu Get Zostanie wyświetlony monit o odinstalowanie programu 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 oznacz jako komentarz klasy ApplicationUser i ApplicationDbContext . W aplikacji MVC można usunąć cały plik IdentityModels.cs. W aplikacji Web Forms usuń dwie klasy, ale upewnij się, że zachowasz klasę pomocnika znajdującą się również w pliku IdentityModels.cs.

  3. Jeśli dostawca magazynu znajduje się w osobnym projekcie, dodaj do niego odwołanie w aplikacji internetowej.

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

  5. W klasie Startup.Auth.cs zmień metodę ConfigureAuth , aby użyć pojedynczego wystąpienia odpowiedniego kontekstu.

    public void ConfigureAuth(IAppBuilder app)
    {
        app.CreatePerOwinContext(ExampleStorageContext.Create);
        app.CreatePerOwinContext(ApplicationUserManager.Create);
        ...
    
  6. W folderze App_Start otwórz plik IdentityConfig.cs. W klasie ApplicationUserManager zmień metodę Create , aby zwrócić menedżera użytkowników, który używa dostosowanego magazynu użytkowników.

    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 elementu ApplicationUser wartością IdentityUser.

  8. Projekt domyślny zawiera niektóre elementy członkowskie w klasie użytkownika, które nie są zdefiniowane w interfejsie IUser; takich jak Email, PasswordHash i GenerateUserIdentityAsync. Jeśli klasa użytkownika nie ma tych elementów członkowskich, musisz je zaimplementować lub zmienić kod, który używa tych elementów członkowskich.

  9. Jeśli utworzono jakiekolwiek wystąpienia roliManager, zmień ten kod, aby używał nowej klasy RoleStore.

    var roleManager = new RoleManager<IdentityRole>(new RoleStore(context.Get<ExampleStorageContext>()));
    
  10. Projekt domyślny jest przeznaczony dla klasy użytkownika, która ma wartość ciągu dla klucza. Jeśli klasa użytkownika ma inny typ klucza (na przykład liczbę całkowitą), musisz zmienić projekt tak, aby działał z typem. Zobacz Zmienianie klucza podstawowego dla użytkowników w usłudze ASP.NET Identity.

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

Inne zasoby