Ü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
- Grundlegendes zu den gespeicherten Daten
- Erstellen der Datenzugriffsebene
- Anpassen der Benutzerklasse
- Anpassen des Benutzerspeichers
- Anpassen der Rollenklasse
- Anpassen des Rollenspeichers
- Neukonfigurieren der Anwendung für die Verwendung des neuen Speicheranbieters
- Andere Implementierungen benutzerdefinierter Speicheranbieter
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.
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.
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.
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.
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.
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> .
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
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.
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.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.
Wenn sich Ihr Speicheranbieter in einem separaten Projekt befindet, fügen Sie in Ihrer Webanwendung einen Verweis darauf hinzu.
Ersetzen Sie alle Verweise auf
using Microsoft.AspNet.Identity.EntityFramework;
durch eine using-Anweisung für den Namespace Ihres Speicheranbieters.Ä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); ...
Ö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>())); ... }
Ersetzen Sie alle Verweise auf ApplicationUser durch IdentityUser.
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.
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>()));
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.
Fügen Sie bei Bedarf die Verbindungszeichenfolge der Web.config-Datei hinzu.
Weitere Ressourcen
- Blog: Implementieren von ASP.NET Identity
- Tutorial und GIT-Code: Simple.Data Asp.Net Identity Provider
- Tutorial: Einrichten der grundlegenden Identitätskonten und Verweisen auf eine externe Datenbank. Durch @xivSolutions.
- Tutorial: Implementieren eines benutzerdefinierten MySQL-ASP.NET Identity Storage-Anbieters
- CodeFluent-Entitäten von SoftFluent
- Azure Table Storage von James Randall.
- Azure Table Storage: AspNet.Identity.TableStorage von @stuartleeks.
- CouchDB / Cloudant von Daniel Wertheim.
- Elastic Search: Elastic Identity von Bombsquad AB.
- MongoDB von Jonathan Sheely Jonathan Sheely.
- NHibernate.AspNet.Identity von Antônio Milesi Bastos.
- RavenDB von @tourismgeek.
- RavenDB.AspNet.Identity von ILMServices.
- Redis: Redis.AspNet.Identity
- T4-Vorlagen zum Generieren von EF-Code für einen Benutzerspeicher "Datenbank zuerst": AspNet.Identity.EntityFramework