ASP.NET Kern-Identität Hinzufügen von benutzerdefinierten Rollen beim starten der Anwendung
In einem ASP.NET Core-Anwendung, die ich will, um bestimmte Rollen, die als Grundlage für die Verwaltung verschiedener Benutzer-Berechtigungen. Leider ist die Dokumentation informieren detailliert, wie benutzerdefinierte Rollen z.B. in Controller/Aktionen, aber nicht, wie um Sie zu erstellen. Ich fand heraus, dass ich kann verwenden RoleManager<IdentityRole>
für diese, wo die Instanz wird automatisch injiziert, die in einem controller-Konstruktor, wenn ein definierter und ASP.NET Kern-Identität registriert ist, in der Anwendung.
Diese lassen Sie mich hinzufügen, um eine benutzerdefinierte Rolle, wie diese:
var testRole = new IdentityRole("TestRole");
if(!roleManager.RoleExistsAsync(testRole.Name).Result) {
roleManager.CreateAsync(testRole);
}
Es funktioniert, und erstellen Sie die Rolle in der Datenbank. Aber diese Prüfung wird immer overhead für die Datenbank, den Aufruf der bestimmten controller/action. Ich will also überprüfen einmal nach meiner Bewerbung begonnen hat, wenn die benutzerdefinierte Funktion, die vorhanden ist, und fügen Sie Sie hinzu. Die ConfigureServices
Methode in Startup.cs scheint gut für diese.
Aber: Wie kann ich erstellen Sie eine Instanz der RoleManager<IdentityRole>
Klasse, dies zu tun? Ich möchte eine best-practice-Ansatz hier und nicht andauernd durch die Schaffung von je Instanzen auf meine eigene, die scheint, zu verursachen eine Menge Arbeit, da es nicht gut dokumentiert und wird sicherlich nicht Folgen best practices, da ASP.NET Kern ist die Verwendung von dependency injection für Dinge wie diese (das ist auch angemessen in meiner Meinung nach).
In anderen Worten: ich dependeny injection außerhalb ein controller.
InformationsquelleAutor Lion | 2016-10-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein Beispiel, für Ihre Bedürfnisse, die migriert und Samen der Datenbank auf startup:
Erstellen Sie eine statische Klasse:
Und in
Startup.cs
:if (await db.Database.EnsureCreatedAsync())
Zustand istfalse
also keine Rollen erstellt werden.Guten Fang. Ich ersetzen Sie mit
if (dbContext.Database.GetPendingMigrations().Any())
undawait dbContext.Database.MigrateAsync();
Versuchen tun die wenn nur, WENN die Migrationen laufen... so Etwas wie
if (dbContext.Database.GetPendingMigrations().Any()) await dbContext.Database.MigrateAsync();
Wenn ich
dbContext.Database.GetPendingMigrations().Any()
ich bin immer ein'DatabaseFacade' does not contain a definition for 'GetPendingMigrations'
Der code wurde versucht zu lösen, eine Instanz von
RoleManager
aus dem falschen Bereich. Ich aktualisierte die Antwort, dass zu beheben.InformationsquelleAutor tmg
Ich würde es vorziehen, die Samen, die Daten nur, wenn es keine Rollen, die bereits in die Datenbank eingefügt. In anderen Worten speichern Sie die Rollen nur, wenn die Anwendung zum ersten mal ausgeführt:
Und auf Start.cs:
InformationsquelleAutor Millan Sanchez