Freigeben über


Übersicht über benutzerdefinierte Speicheranbieter für ASP.NET Identity

von Tom FitzMacken

ASP.NET Identity ist ein erweiterbares System, mit dem Sie Ihren eigenen Speicheranbieter erstellen und an Ihre Anwendung anschließen können, ohne die Anwendung erneut zu verwenden. In diesem Thema wird beschrieben, wie Sie einen benutzerdefinierten Speicheranbieter für ASP.NET Identity erstellen. Es behandelt die wichtigen Konzepte zum Erstellen Ihres eigenen Speicheranbieters, aber es ist keine schrittweise exemplarische Vorgehensweise zur Implementierung eines benutzerdefinierten Speicheranbieters.

Ein Beispiel für die Implementierung eines benutzerdefinierten Speicheranbieters finden Sie unter Implementieren eines benutzerdefinierten MySQL-ASP.NET Identitätsspeicheranbieters.

Dieses Thema wurde für ASP.NET Identity 2.0 aktualisiert.

Im Lernprogramm verwendete Softwareversionen

  • Visual Studio 2013 mit Update 2
  • ASP.NET Identität 2

Einführung

Standardmäßig speichert das ASP.NET Identity-System Benutzerinformationen in einer SQL Server-Datenbank und verwendet entity Framework Code First zum Erstellen der Datenbank. Für viele Anwendungen funktioniert dieser Ansatz gut. Sie können jedoch lieber einen anderen Persistenzmechanismus verwenden, z. B. Azure Table Storage, oder Sie verfügen möglicherweise bereits über Datenbanktabellen mit einer sehr anderen Struktur als die Standardimplementierung. In beiden Fällen können Sie einen benutzerdefinierten Anbieter für Ihren Speichermechanismus schreiben und diesen Anbieter in Ihre Anwendung anschließen.

ASP.NET Identity ist standardmäßig in vielen Visual Studio 2013-Vorlagen enthalten. Sie können Updates für ASP.NET Identity über das Microsoft AspNet Identity EntityFramework NuGet-Paket abrufen.

Dieses Thema enthält die folgenden Abschnitte:

Die Architektur verstehen

ASP.NET Identity besteht aus Klassen namens Managern und Stores. Manager sind allgemeine Klassen, die ein Anwendungsentwickler verwendet, um Vorgänge auszuführen, z. B. das Erstellen eines Benutzers, im ASP.NET Identity-System. Stores sind Klassen auf niedrigerer Ebene, die angeben, wie Entitäten, z. B. Benutzer und Rollen, beibehalten werden. Stores sind eng mit dem Persistenzmechanismus verbunden, aber Manager werden von Stores entkoppelt, was bedeutet, dass Sie den Persistenzmechanismus ersetzen können, ohne die gesamte Anwendung zu unterbrechen.

Das folgende Diagramm zeigt, wie Ihre Webanwendung mit den Managern interagiert und mit der Datenzugriffsschicht interagiert.

Diagramm, das zeigt, wie Ihre Webanwendung mit den Managern interagiert

Um einen benutzerdefinierten Speicheranbieter für ASP.NET Identity zu erstellen, müssen Sie die Datenquelle, die Datenzugriffsebene und die Speicherklassen erstellen, die mit dieser Datenzugriffsschicht interagieren. Sie können weiterhin dieselben Manager-APIs verwenden, um Datenvorgänge für den Benutzer auszuführen, aber jetzt werden die Daten in einem anderen Speichersystem gespeichert.

Sie müssen die Managerklassen nicht anpassen, da Sie beim Erstellen einer neuen Instanz von UserManager oder RoleManager den Typ der Benutzerklasse angeben und eine Instanz der Speicherklasse als Argument übergeben. Mit diesem Ansatz können Sie Ihre angepassten Klassen in die vorhandene Struktur integrieren. Sie erfahren, wie Sie UserManager und RoleManager mit Ihren angepassten Speicherklassen im Abschnitt Neukonfiguration der Anwendung für die Verwendung eines neuen Speicheranbieters instanziieren.

Grundlegendes zu den gespeicherten Daten

Um einen benutzerdefinierten Speicheranbieter zu implementieren, müssen Sie die Datentypen verstehen, die mit ASP.NET Identity verwendet werden, und entscheiden, welche Features für Ihre Anwendung relevant sind.

Daten Beschreibung
Benutzer Registrierte Benutzer*innen Ihrer Website. Enthält die Benutzer-ID und den Benutzernamen. Enthält möglicherweise ein Kennwort mit Hash, wenn sich Benutzer mit Anmeldeinformationen anmelden, die für Ihre Website spezifisch sind (anstatt Anmeldeinformationen von einer externen Website wie Facebook zu verwenden), und Sicherheitsstempel, um anzugeben, ob sich etwas in den Benutzeranmeldeinformationen geändert hat. Kann auch die E-Mail-Adresse, die Telefonnummer, ob die Zwei-Faktor-Authentifizierung aktiviert ist, die aktuelle Anzahl der fehlgeschlagenen Anmeldungen und ob ein Konto gesperrt ist, umfassen.
Benutzeransprüche Eine Reihe von Aussagen (oder Behauptungen) über den Benutzer, die die Identität des Benutzers darstellen. Kann einen größeren Ausdruck der Identität des Benutzers ermöglichen, als durch Rollen erreicht werden kann.
Benutzeranmeldungen Informationen zum externen Authentifizierungsanbieter (z. B. Facebook), der bei der Anmeldung bei einem Benutzer verwendet werden soll.
Rollen Autorisierungsgruppen für Ihre Website. Umfasst die Rollen-ID und den Rollennamen (wie etwa „Admin“ oder „Mitarbeiter*in“).

Erstellen der Datenzugriffsebene

In diesem Thema wird davon ausgegangen, dass Sie mit dem zu verwendenden Persistenzmechanismus vertraut sind und wissen, wie Sie Entitäten für diesen Mechanismus erstellen. Dieses Thema enthält keine Details zum Erstellen der Repositorys oder Datenzugriffsklassen. Stattdessen werden einige Vorschläge zu den Entwurfsentscheidungen bereitgestellt, die Sie beim Arbeiten mit ASP.NET Identity treffen müssen.

Beim Entwerfen der Repositorys für einen angepassten Store-Anbieter haben Sie viel Freiheit. Sie müssen nur Repositorys für Features erstellen, die Sie in Ihrer Anwendung verwenden möchten. Wenn Sie beispielsweise keine Rollen in Ihrer Anwendung verwenden, müssen Sie keinen Speicher für Rollen oder Benutzerrollen erstellen. Ihre Technologie und vorhandene Infrastruktur erfordern möglicherweise eine Struktur, die sich von der Standardimplementierung von ASP.NET Identity unterscheidet. In Ihrer Datenzugriffsebene stellen Sie die Logik für die Arbeit mit der Struktur Ihrer Repositorys bereit.

Eine MySQL-Implementierung von Datenrepositorys für ASP.NET Identity 2.0 finden Sie unter MySQLIdentity.sql.

In der Datenzugriffsebene stellen Sie die Logik zum Speichern der Daten aus ASP.NET Identität in Ihrer Datenquelle bereit. Die Datenzugriffsebene für Ihren benutzerdefinierten Speicheranbieter könnte die folgenden Klassen enthalten, um Benutzer- und Rolleninformationen zu speichern.

Klasse Beschreibung Beispiel
Kontext Kapselt die Informationen, um eine Verbindung mit Ihrem Persistenzmechanismus herzustellen und Abfragen auszuführen. Diese Klasse ist für Ihre Datenzugriffsebene zentral. Die anderen Datenklassen erfordern eine Instanz dieser Klasse, um ihre Vorgänge auszuführen. Außerdem werden Sie Ihre Store-Klassen mit einer Instanz dieser Klasse initialisieren. MySQLDatabase
Benutzerspeicher Speichert und ruft Benutzerinformationen ab (z. B. Benutzername und Kennworthash). UserTable (MySQL)
Rollenspeicher Speichert und ruft Rolleninformationen ab (z. B. den Rollennamen). RoleTable (MySQL)
UserClaims-Speicher Speichert und ruft Informationen zum Benutzeranspruch ab (z. B. Anspruchstyp und -wert). UserClaimsTable (MySQL)
UserLogins-Speicher Speichert und ruft Informationen zur Benutzeranmeldung ab (z. B. einen externen Authentifizierungsanbieter). UserLoginsTable (MySQL)
UserRole-Speicher (Benutzerspeicherung) Speichert und ruft ab, welchen Rollen ein Benutzer zugewiesen ist. UserRoleTable (MySQL)

Auch hier müssen Sie nur die Klassen implementieren, die Sie in Ihrer Anwendung verwenden möchten.

In den Datenzugriffsklassen stellen Sie Code zum Ausführen von Datenvorgängen für den jeweiligen Persistenzmechanismus bereit. Beispielsweise enthält die UserTable-Klasse innerhalb der MySQL-Implementierung eine Methode, um einen neuen Datensatz in die Datenbanktabelle "Users" einzufügen. Die benannte _database Variable ist eine Instanz der MySQLDatabase-Klasse.

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);
}

Nachdem Sie Ihre Datenzugriffsklassen erstellt haben, müssen Sie Speicherklassen erstellen, die die spezifischen Methoden in der Datenzugriffsebene aufrufen.

Anpassen der Benutzerklasse

Bei der Implementierung Ihres eigenen Speicheranbieters müssen Sie eine Benutzerklasse erstellen, die der IdentityUser-Klasse im namespace Microsoft.ASP.NET.Identity.EntityFramework entspricht:

Das folgende Diagramm zeigt die IdentityUser-Klasse, die Sie erstellen müssen, und die Schnittstelle, die in dieser Klasse implementiert werden soll.

Abbildung der Identity User-Klasse

Die IUser<TKey-Schnittstelle> definiert die Eigenschaften, die der UserManager aufruft, wenn angeforderte Vorgänge ausgeführt werden. Die Schnittstelle enthält zwei Eigenschaften : ID und UserName. Mit der IUser<TKey-Schnittstelle> können Sie den Typ des Schlüssels für den Benutzer über den generischen TKey-Parameter angeben. Der Typ der Id-Eigenschaft entspricht dem Wert des TKey-Parameters.

Das Identitätsframework stellt auch die IUser-Schnittstelle (ohne den generischen Parameter) bereit, wenn Sie einen Zeichenfolgenwert für den Schlüssel verwenden möchten.

Die IdentityUser-Klasse implementiert IUser und enthält alle zusätzlichen Eigenschaften oder Konstruktoren für Benutzer auf Ihrer Website. Das folgende Beispiel zeigt eine IdentityUser-Klasse, die eine ganze Zahl für den Schlüssel verwendet. Das Feld "ID" ist auf "int " festgelegt, um dem Wert des generischen Parameters zu entsprechen.

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
}

Eine vollständige Implementierung finden Sie unter IdentityUser (MySQL).For a complete implementation, see IdentityUser (MySQL).

Anpassen des Benutzerspeichers

Sie erstellen auch eine UserStore-Klasse, die die Methoden für alle Datenvorgänge für den Benutzer bereitstellt. Diese Klasse entspricht der UserStore<TUser-Klasse> im namespace Microsoft.ASP.NET.Identity.EntityFramework . In Ihrer UserStore-Klasse implementieren Sie die IUserStore<TUser, TKey> und eine der optionalen Schnittstellen. Sie wählen aus, welche optionalen Schnittstellen basierend auf der Funktionalität implementiert werden sollen, die Sie in Ihrer Anwendung bereitstellen möchten.

Die folgende Abbildung zeigt die UserStore-Klasse, die Sie erstellen müssen, und die relevanten Schnittstellen.

Abbildung der User Store-Klasse

Die Standardprojektvorlage in Visual Studio enthält Code, der davon ausgeht, dass viele der optionalen Schnittstellen im Benutzerspeicher implementiert wurden. Wenn Sie die Standardvorlage mit einem angepassten Benutzerspeicher verwenden, müssen Sie entweder optionale Schnittstellen in Ihrem Benutzerspeicher implementieren oder den Vorlagencode ändern, um keine Methoden mehr in den Schnittstellen aufzurufen, die Sie nicht implementiert haben.

Das folgende Beispiel zeigt eine einfache Benutzerspeicherklasse. Der generische TUser-Parameter verwendet den Typ Ihrer Benutzerklasse, die in der Regel die von Ihnen definierte IdentityUser-Klasse ist. Der generische TKey-Parameter verwendet den Typ des Benutzerschlüssels.

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

In diesem Beispiel ist der Konstruktor, der einen Parameter mit dem Namen database vom Typ ExampleDatabase verwendet, nur ein Beispiel dafür, wie Ihre Datenzugriffsklasse übergeben wird. In der MySQL-Implementierung verwendet dieser Konstruktor beispielsweise einen Parameter vom Typ MySQLDatabase.

In Ihrer UserStore-Klasse verwenden Sie die von Ihnen erstellten Datenzugriffsklassen zum Ausführen von Vorgängen. Beispielsweise verfügt die UserStore-Klasse in der MySQL-Implementierung über die CreateAsync-Methode, die eine Instanz von UserTable verwendet, um einen neuen Datensatz einzufügen. Die Insert-Methode für das UserTable-Objekt ist dieselbe Methode, die im vorherigen Abschnitt angezeigt wurde.

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

    userTable.Insert(user);

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

Zu implementierende Schnittstellen beim Anpassen des Benutzerspeichers

Die nächste Abbildung zeigt weitere Details zu den in den einzelnen Schnittstellen definierten Funktionen. Alle optionalen Schnittstellen erben von IUserStore.

Abbildung mit weiteren Details zu den in den einzelnen Schnittstellen definierten Funktionen

  • IUserStore
    Die IUserStore<TUser, TKey>-Schnittstelle ist die einzige Schnittstelle, die Sie in Ihrem Benutzerspeicher implementieren müssen. Sie definiert Methoden zum Erstellen, Aktualisieren, Löschen und Abrufen von Benutzer*innen.

  • IUserClaimStore
    Die IUserClaimStore<TUser, TKey-Schnittstelle> definiert die Methoden, die Sie in Ihrem Benutzerspeicher implementieren müssen, um Benutzeransprüche zu aktivieren. Sie enthält Methoden zum Hinzufügen, Entfernen und Abrufen von Benutzeransprüchen.

  • IUserLoginStore
    Der IUserLoginStore<TUser, TKey> definiert die Methoden, die Sie in Ihrem Benutzerspeicher implementieren müssen, um externe Authentifizierungsanbieter zu aktivieren. Sie enthält Methoden zum Hinzufügen, Entfernen und Abrufen von Benutzer*innen und eine Methode zum Abrufen von Benutzer*innen anhand der Anmeldeinformationen.

  • IUserRoleStore
    Die IUserRoleStore-TKey<-, TUser-Schnittstelle> definiert die Methoden, die Sie in Ihrem Benutzerspeicher implementieren müssen, um einem Benutzer eine Rolle zuzuordnen. Sie enthält Methoden zum Hinzufügen, Entfernen und Abrufen von Benutzerrollen sowie eine Methode zur Überprüfung, ob Benutzer*innen einer Rolle zugewiesen sind.

  • IUserPasswordStore
    Die IUserPasswordStore-TUser<-, TKey-Schnittstelle> definiert die Methoden, die Sie in Ihrem Benutzerspeicher implementieren müssen, um Hash-Kennwörter beizubehalten. Sie enthält Methoden zum Abrufen und Festlegen des gehashten Kennworts sowie eine Methode, die anzeigt, ob die Benutzer*innen ein Kennwort festgelegt haben.

  • IUserSecurityStampStore
    Die Schnittstelle IUserSecurityStampStore<TUser, TKey> definiert die Methoden, die Sie in Ihrem Benutzerspeicher implementieren müssen, um einen Sicherheitsstempel zu verwenden, der anzeigt, ob sich die Kontoinformationen des Benutzers geändert haben. Dieser Stempel wird aktualisiert, wenn Benutzer*innen das Kennwort ändern oder Anmeldungen hinzufügen oder entfernen. Die Schnittstelle enthält Methoden zum Abrufen und Festlegen des Sicherheitsstempels.

  • IUserTwoFactorStore
    Die Schnittstelle IUserTwoFactorStore<TUser, TKey> definiert die Methoden, die Sie implementieren müssen, um die zweistufige Authentifizierung zu verwirklichen. Sie enthält Methoden zum Abrufen und Festlegen, ob die Zwei-Faktor-Authentifizierung für Benutzer*innen aktiviert ist.

  • IUserPhoneNumberStore
    Die IUserPhoneNumberStore<TUser- und TKey-Schnittstelle> definiert die Methoden, die Sie zum Speichern von Benutzertelefonnummern implementieren müssen. Sie enthält Methoden zum Abrufen und Festlegen der Telefonnummer sowie zur Überprüfung, ob die Telefonnummer bestätigt ist.

  • IUserEmailStore
    Die IUserEmailStore<TUser, TKey-Schnittstelle> definiert die Methoden, die Sie zum Speichern von Benutzer-E-Mail-Adressen implementieren müssen. Sie enthält Methoden zum Abrufen und Festlegen der E-Mail-Adresse sowie zur Überprüfung, ob die E-Mail-Adresse bestätigt ist.

  • IUserLockoutStore
    Die IUserLockoutStore-TUser<-, TKey-Schnittstelle> definiert die Methoden, die Sie implementieren müssen, um Informationen zum Sperren eines Kontos zu speichern. Es enthält Methoden zum Abrufen der aktuellen Anzahl fehlgeschlagener Zugriffsversuche, abrufen und festlegen, ob das Konto gesperrt werden kann, das Enddatum für das Sperren abzurufen und festzulegen, die Anzahl der fehlgeschlagenen Versuche zu erhöhen und die Anzahl der fehlgeschlagenen Versuche zurückzusetzen.

  • IQueryableUserStore
    Die Schnittstelle IQueryableUserStore definiert die Elemente, die Sie implementieren müssen, um einen abfragbaren Benutzerspeicher zur Verfügung zu stellen. Sie enthält eine Eigenschaft, die die abfragbaren Benutzer enthält.

    Sie implementieren die Schnittstellen, die in Ihrer Anwendung benötigt werden; z. B. die IUserClaimStore-, IUserLoginStore-, IUserRoleStore-, IUserPasswordStore- und IUserSecurityStampStore-Schnittstellen wie unten dargestellt.

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
}

Eine vollständige Implementierung (einschließlich aller Schnittstellen) finden Sie unter UserStore (MySQL).

IdentityUserClaim, IdentityUserLogin und IdentityUserRole

Der Microsoft.AspNet.Identity.EntityFramework-Namespace enthält Implementierungen der Klassen IdentityUserClaim, IdentityUserLogin und IdentityUserRole . Wenn Sie diese Features verwenden, können Sie ihre eigenen Versionen dieser Klassen erstellen und die Eigenschaften für Ihre Anwendung definieren. Manchmal ist es jedoch effizienter, diese Entitäten nicht in den Arbeitsspeicher zu laden, wenn grundlegende Vorgänge ausgeführt werden (z. B. Hinzufügen oder Entfernen des Anspruchs eines Benutzers). Stattdessen können die Back-End-Speicherklassen diese Operationen direkt in der Datenquelle ausführen. Beispielsweise kann die Methode UserStore.GetClaimsAsync() die Methode userClaimTable.FindByUserId(user.Id) aufrufen, um direkt eine Abfrage auf dieser Tabelle auszuführen und eine Liste von Ansprüchen zurückzugeben.

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

Anpassen der Rollenklasse

Beim Implementieren Ihres eigenen Speicheranbieters müssen Sie eine Rollenklasse erstellen, die der IdentityRole-Klasse im namespace Microsoft.ASP.NET.Identity.EntityFramework entspricht:

Das folgende Diagramm zeigt die IdentityRole-Klasse, die Sie erstellen müssen, und die Schnittstelle, die in dieser Klasse implementiert werden soll.

Abbildung der Identity Role-Klasse

Die IRole<TKey-Schnittstelle> definiert die Eigenschaften, die der RoleManager aufruft, wenn angeforderte Vorgänge ausgeführt werden. Die Schnittstelle enthält zwei Eigenschaften : ID und Name. Mit der IRole<TKey-Schnittstelle> können Sie den Typ des Schlüssels für die Rolle über den generischen TKey-Parameter angeben. Der Typ der Id-Eigenschaft entspricht dem Wert des TKey-Parameters.

Das Identity Framework stellt auch die IRole-Schnittstelle (ohne den generischen Parameter) bereit, wenn Sie einen Zeichenfolgenwert für den Schlüssel verwenden möchten.

Das folgende Beispiel zeigt eine IdentityRole-Klasse, die eine ganze Zahl für den Schlüssel verwendet. Das Feld "ID" ist auf "int" festgelegt, um dem Wert des generischen Parameters zu entsprechen.

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

Eine vollständige Implementierung finden Sie unter IdentityRole (MySQL).

Anpassen des Rollenspeichers

Außerdem erstellen Sie eine RoleStore-Klasse, die die Methoden für alle Datenvorgänge für Rollen bereitstellt. Diese Klasse entspricht der RoleStore<TRole-Klasse> im namespace Microsoft.ASP.NET.Identity.EntityFramework. In Ihrer RoleStore-Klasse implementieren Sie die IRoleStore<TRole, TKey>- und optional die IQueryableRoleStore<TRole, TKey>-Schnittstelle.

Abbildung einer Rollenspeicherklasse

Das folgende Beispiel zeigt eine Rollenspeicherklasse. Der generische TRole-Parameter verwendet den Typ Ihrer Rollenklasse, die normalerweise die von Ihnen definierte IdentityRole-Klasse ist. Der generische TKey-Parameter verwendet den Typ Ihres Rollenschlüssels.

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>
    Die IRoleStore-Schnittstelle definiert die Methoden, die in Ihrer Rollenspeicherklasse implementiert werden sollen. Es enthält Methoden zum Erstellen, Aktualisieren, Löschen und Abrufen von Rollen.

  • RoleStore<TRole>
    Erstellen Sie zum Anpassen von RoleStore eine Klasse, die die IRoleStore-Schnittstelle implementiert. Sie müssen diese Klasse nur implementieren, wenn Sie Rollen auf Ihrem System verwenden möchten. Der Konstruktor, der einen Parameter namens database vom Typ ExampleDatabase entgegennimmt, ist nur ein Beispiel dafür, wie Ihre Datenzugriffsklasse übergeben wird. In der MySQL-Implementierung verwendet dieser Konstruktor beispielsweise einen Parameter vom Typ MySQLDatabase.

    Eine vollständige Implementierung finden Sie unter RoleStore (MySQL) .

Neukonfiguration der Anwendung zur Verwendung eines neuen Speicheranbieters

Sie haben Ihren neuen Speicheranbieter implementiert. Jetzt müssen Sie Ihre Anwendung so konfigurieren, dass dieser Speicheranbieter verwendet wird. Wenn der Standardspeicheranbieter in Ihrem Projekt enthalten war, müssen Sie den Standardanbieter entfernen und durch Ihren Anbieter ersetzen.

Ersetzen des Standardspeicheranbieters im MVC-Projekt

  1. Deinstallieren Sie im Fenster "NuGet-Pakete verwalten " das Microsoft ASP.NET Identity EntityFramework-Paket . Sie finden dieses Paket, indem Sie in den installierten Paketen nach Identity.EntityFramework suchen.
    Abbildung des Fensters Sie werden gefragt, ob Sie auch Entity Framework deinstallieren möchten. Wenn Sie sie nicht in anderen Teilen Ihrer Anwendung benötigen, können Sie sie deinstallieren.

  2. Löschen oder kommentieren Sie in der IdentityModels.cs Datei im Ordner "Models" die Klassen ApplicationUser und ApplicationDbContext aus. In einer MVC-Anwendung können Sie die gesamte IdentityModels.cs Datei löschen. Löschen Sie in einer Webanwendung die beiden Klassen, stellen Sie jedoch sicher, dass Sie die Hilfsklasse beibehalten, die sich auch in der datei IdentityModels.cs befindet.

  3. Wenn sich Ihr Speicheranbieter in einem separaten Projekt befindet, fügen Sie einen Verweis darauf in Ihrer Webanwendung hinzu.

  4. Ersetzen Sie alle Verweise auf using Microsoft.AspNet.Identity.EntityFramework; durch eine using-Anweisung für den Namespace Ihres Speicheranbieters.

  5. Ändern Sie in der klasse Startup.Auth.cs die ConfigureAuth-Methode , um eine einzelne Instanz des entsprechenden Kontexts zu verwenden.

    public void ConfigureAuth(IAppBuilder app)
    {
        app.CreatePerOwinContext(ExampleStorageContext.Create);
        app.CreatePerOwinContext(ApplicationUserManager.Create);
        ...
    
  6. Öffnen Sie im Ordner App_Start IdentityConfig.cs. Ändern Sie in der ApplicationUserManager-Klasse die Create-Methode , um einen Benutzermanager zurückzugeben, der Ihren angepassten Benutzerspeicher verwendet.

    public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
    {
        var manager = new ApplicationUserManager(new UserStore(context.Get<ExampleStorageContext>()));
        ...
    }
    
  7. Ersetzen Sie alle Verweise auf ApplicationUser durch IdentityUser.

  8. Das Standardprojekt enthält einige Elemente in der Benutzerklasse, die nicht in der IUser-Schnittstelle definiert sind. z. B. E-Mail, PasswordHash und GenerateUserIdentityAsync. Wenn Ihre Benutzerklasse nicht über diese Member verfügt, müssen Sie sie entweder implementieren oder den Code ändern, der diese Member verwendet.

  9. Wenn Sie Instanzen von RoleManager erstellt haben, ändern Sie diesen Code so, dass die neue RoleStore-Klasse verwendet wird.

    var roleManager = new RoleManager<IdentityRole>(new RoleStore(context.Get<ExampleStorageContext>()));
    
  10. Das Standardprojekt wurde für eine Benutzerklasse entwickelt, die über einen Zeichenfolgenwert für den Schlüssel verfügt. Wenn Ihre Benutzerklasse einen anderen Typ für den Schlüssel hat (z. B. eine ganze Zahl), müssen Sie das Projekt so ändern, dass er mit Ihrem Typ arbeitet. Siehe "Primärschlüssel für Benutzer in ASP.NET Identität ändern".

  11. Fügen Sie bei Bedarf die Verbindungszeichenfolge zur Web.config Datei hinzu.

Weitere Ressourcen