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 ihn 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 eines eigenen Speicheranbieters, ist aber 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 Identity Storage-Anbieters.

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

Im Tutorial 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, um die Datenbank zu erstellen. Für viele Anwendungen funktioniert dieser Ansatz gut. Möglicherweise bevorzugen Sie jedoch einen anderen Persistenzmechanismus, z. B. Azure Table Storage, oder Sie verfügen bereits über Datenbanktabellen mit einer ganz anderen Struktur als die Standardimplementierung. In beiden Fällen können Sie einen benutzerdefinierten Anbieter für Ihren Speichermechanismus schreiben und diesen Anbieter an Ihre Anwendung anschließen.

ASP.NET Identity ist standardmäßig in vielen der 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:

Grundlegendes zur Architektur

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

Das folgende Diagramm zeigt, wie Ihre Webanwendung mit den Managern interagiert, und Die Speicher interagieren mit der Datenzugriffsebene.

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 Datenzugriffsebene 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 instance von UserManager oder RoleManager den Typ der Benutzerklasse angeben und eine instance der Speicherklasse als Argument übergeben. Mit diesem Ansatz können Sie Ihre angepassten Klassen an die vorhandene Struktur anschließen. Wie Sie UserManager und RoleManager mit Ihren benutzerdefinierten Speicherklassen instanziieren, erfahren Sie im Abschnitt Neukonfiguration der Anwendung für die Verwendung des neuen Speicheranbieters.

Grundlegendes zu den gespeicherten Daten

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

Daten BESCHREIBUNG
Benutzer Registrierte Benutzer Ihrer Website. Enthält die Benutzer-ID und den Benutzernamen. Kann ein Hashkennwort enthalten, wenn sich Benutzer mit Anmeldeinformationen anmelden, die für Ihre Website spezifisch sind (anstatt Anmeldeinformationen von einer externen Website wie Facebook zu verwenden), und einen Sicherheitsstempel, um anzugeben, ob sich an den Benutzeranmeldeinformationen etwas geändert hat. Kann auch E-Mail-Adresse, Telefonnummer, ob die zweistufige Authentifizierung aktiviert ist, die aktuelle Anzahl fehlerhafter Anmeldungen und ob ein Konto gesperrt wurde.
Benutzeransprüche Eine Reihe von Anweisungen (oder Ansprüchen) ü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 eines Benutzers verwendet werden soll.
Rollen Autorisierungsgruppen für Ihre Website. Enthält die Rollen-ID und den Rollennamen (z. B. "Admin" oder "Mitarbeiter").

Erstellen der Datenzugriffsebene

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

Sie haben viel Freiheit beim Entwerfen der Repositorys für einen angepassten Storeanbieter. 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 stark von der Standardimplementierung von ASP.NET Identity unterscheidet. In Ihrer Datenzugriffsebene stellen Sie die Logik bereit, um mit der Struktur Ihrer Repositorys zu arbeiten.

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 Identity in Ihrer Datenquelle bereit. Die Datenzugriffsebene für Ihren benutzerdefinierten Speicheranbieter kann 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 von zentraler Bedeutung für Ihre Datenzugriffsebene. Für die anderen Datenklassen ist eine instance dieser Klasse erforderlich, um ihre Vorgänge auszuführen. Außerdem initialisieren Sie Ihre Speicherklassen mit einer instance dieser Klasse. MySQLDatabase
Benutzerspeicher Speichert und ruft Benutzerinformationen (z. B. Benutzername und Kennworthash) ab. UserTable (MySQL)
Rollenspeicher Speichert und ruft Rolleninformationen (z. B. den Rollennamen) ab. RoleTable (MySQL)
UserClaims Storage Speichert und ruft Benutzeranspruchsinformationen (z. B. Anspruchstyp und -wert) ab. UserClaimsTable (MySQL)
UserLogins Storage Speichert und ruft Benutzeranmeldungsinformationen (z. B. einen externen Authentifizierungsanbieter) ab. UserLoginsTable (MySQL)
UserRole Storage 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 Ihren bestimmten Persistenzmechanismus bereit. Beispielsweise enthält die UserTable-Klasse innerhalb der MySQL-Implementierung eine Methode zum Einfügen eines neuen Datensatzes in die Datenbanktabelle Users. Die Variable namens _database ist eine instance 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

Wenn Sie Ihren eigenen Speicheranbieter implementieren, müssen Sie eine Benutzerklasse erstellen, die der IdentityUser-Klasse im Microsoft.ASP.NET.Identity.EntityFramework-Namespace 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 beim Ausführen angeforderter Vorgänge aufrufen möchte. 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 Identity-Framework 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 wird 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).

Anpassen des Benutzerspeichers

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

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 benutzerdefinierten Benutzerspeicher verwenden, müssen Sie entweder optionale Schnittstellen in Ihrem Benutzerspeicher implementieren oder den Vorlagencode so ändern, dass keine Methoden mehr in den Schnittstellen aufgerufen werden, die Sie nicht implementiert haben.

Das folgende Beispiel zeigt eine einfache Benutzerspeicherklasse. Der generische TUser-Parameter nimmt den Typ Ihrer Benutzerklasse an, bei der es sich in der Regel um die von Ihnen definierte IdentityUser-Klasse handelt. Der generische TKey-Parameter verwendet den Typ Ihres 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 akzeptiert, nur eine Abbildung der Übergabe ihrer Datenzugriffsklasse. In der MySQL-Implementierung akzeptiert dieser Konstruktor beispielsweise einen Parameter vom Typ MySQLDatabase.

In Ihrer UserStore-Klasse verwenden Sie die datenzugriffsklassen, die Sie erstellt haben, um Vorgänge auszuführen. In der MySQL-Implementierung verfügt die UserStore-Klasse beispielsweise über die CreateAsync-Methode, die eine instance von UserTable verwendet, um einen neuen Datensatz einzufügen. Die Insert-Methode für das userTable-Objekt ist die gleiche Methode, die im vorherigen Abschnitt gezeigt 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 funktionen, die in jeder Schnittstelle definiert sind. 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 Benutzern.

  • 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 oder das 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. Es enthält Methoden zum Hinzufügen, Entfernen und Abrufen von Benutzeranmeldungen sowie eine Methode zum Abrufen eines Benutzers basierend auf den Anmeldeinformationen.

  • IUserRoleStore
    Die IUserRoleStore<TKey, TUser-Schnittstelle> definiert die Methoden, die Sie in Ihrem Benutzerspeicher implementieren müssen, um einen Benutzer einer Rolle zuzuordnen. Sie enthält Methoden zum Hinzufügen, Entfernen und Abrufen der Rollen eines Benutzers sowie eine Methode zum Überprüfen, ob ein Benutzer einer Rolle zugewiesen ist.

  • IUserPasswordStore
    Die IUserPasswordStore<TUser, TKey-Schnittstelle> definiert die Methoden, die Sie in Ihrem Benutzerspeicher implementieren müssen, um Hashkennwörter beizubehalten. Sie enthält Methoden zum Abrufen und Festlegen des Hashkennworts sowie eine Methode, die angibt, ob der Benutzer ein Kennwort festgelegt hat.

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

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

  • IUserPhoneNumberStore
    Die IUserPhoneNumberStore<TUser, TKey-Schnittstelle> definiert die Methoden, die Sie zum Speichern von Benutzertelefonnummern implementieren müssen. Es enthält Methoden zum Abrufen und Festlegen der Telefonnummer und zum Bestätigen der Telefonnummer.

  • 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 und zum Bestätigen der E-Mail.

  • IUserLockoutStore
    Die IUserLockoutStore<TUser, TKey-Schnittstelle> definiert die Methoden, die Sie implementieren müssen, um Informationen zum Sperren eines Kontos zu speichern. Sie enthält Methoden zum Abrufen der aktuellen Anzahl fehlgeschlagener Zugriffsversuche, zum Abrufen und Festlegen, ob das Konto gesperrt werden kann, zum Abrufen und Festlegen des Enddatums für die Sperrung, zum Erhöhen der Anzahl fehlgeschlagener Versuche und zum Zurücksetzen der Anzahl fehlgeschlagener Versuche.

  • IQueryableUserStore
    Die IQueryableUserStore<TUser, TKey-Schnittstelle> definiert die Member, die Sie implementieren müssen, um einen abfragbaren Benutzerspeicher bereitzustellen. 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 Schnittstellen IUserClaimStore, IUserLoginStore, IUserRoleStore, IUserPasswordStore und IUserSecurityStampStore, wie unten gezeigt.

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 eines Benutzeranspruchs). Stattdessen können die Back-End-Speicherklassen diese Vorgänge direkt in der Datenquelle ausführen. Beispielsweise kann die UserStore.GetClaimsAsync()-Methode die userClaimTable.FindByUserId(user. Id) -Methode, um eine Abfrage für diese Tabelle direkt 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

Wenn Sie Ihren eigenen Speicheranbieter implementieren, müssen Sie eine Rollenklasse erstellen, die der IdentityRole-Klasse im Microsoft.ASP.NET.Identity.EntityFramework-Namespace 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 beim Ausführen angeforderter Vorgänge aufrufen möchte. 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 wird 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 Microsoft.ASP.NET.Identity.EntityFramework-Namespace. 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 nimmt den Typ Ihrer Rollenklasse an, bei der es sich in der Regel um die von Ihnen definierte IdentityRole-Klasse handelt. 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. Sie 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 mit dem Namen Database vom Typ ExampleDatabase akzeptiert, ist nur eine Abbildung der Übergabe ihrer Datenzugriffsklasse. In der MySQL-Implementierung akzeptiert dieser Konstruktor beispielsweise einen Parameter vom Typ MySQLDatabase.

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

Neukonfigurieren der Anwendung für die Verwendung eines neuen Speicheranbieters

Sie haben Ihren neuen Speicheranbieter implementiert. Jetzt müssen Sie Ihre Anwendung für die Verwendung dieses Speicheranbieters konfigurieren. 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 Entity Framework auch deinstallieren möchten. Wenn Sie es in anderen Teilen Ihrer Anwendung nicht benötigen, können Sie es deinstallieren.

  2. Löschen Oder kommentieren Sie in der Datei IdentityModels.cs im Ordner Models die Klassen ApplicationUser und ApplicationDbContext aus. In einer MVC-Anwendung können Sie die gesamte Datei IdentityModels.cs löschen. Löschen Sie in einer Web Forms-Anwendung die beiden Klassen, aber stellen Sie sicher, dass Sie die Hilfsklasse beibehalten, die sich ebenfalls in der Datei IdentityModels.cs befindet.

  3. Wenn sich Ihr Speicheranbieter in einem separaten Projekt befindet, fügen Sie in Ihrer Webanwendung einen Verweis darauf 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 Startup.Auth.cs-Klasse die ConfigureAuth-Methode, um eine einzelne instance 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 Benutzer-Manager 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 Member in der Benutzerklasse, die nicht in der IUser-Schnittstelle definiert sind. z. B. Email, 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, um Ihre neue RoleStore-Klasse zu verwenden.

    var roleManager = new RoleManager<IdentityRole>(new RoleStore(context.Get<ExampleStorageContext>()));
    
  10. Das Standardprojekt ist für eine Benutzerklasse konzipiert, die über einen Zeichenfolgenwert für den Schlüssel verfügt. Wenn Ihre Benutzerklasse einen anderen Typ für den Schlüssel aufweist (z. B. eine ganze Zahl), müssen Sie das Projekt ändern, um mit Ihrem Typ zu arbeiten. Weitere Informationen finden Sie unter Ändern des Primärschlüssels für Benutzer in ASP.NET Identität.

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

Weitere Ressourcen