Laden...

Wie kann ich ASP.NET Core Identity im Schichtenmodell mit eigenem Service nutzen?

Erstellt von JimStark vor 3 Jahren Letzter Beitrag vor 3 Jahren 1.436 Views
JimStark Themenstarter:in
309 Beiträge seit 2020
vor 3 Jahren
Wie kann ich ASP.NET Core Identity im Schichtenmodell mit eigenem Service nutzen?

Hi,

ich greife auf eine Datenbank über einen eigenen Service zu, d.h. dass das eigentlich recht abgekoppelt von ASP läuft. Jetzt möchte ich einen ganz simplen Login Mechanismus einbauen. (ohne Registrierung, Passwort vergessen, etc.)
Hierfür wäre ja Identity ganz sinnvoll, in den meisten Beispielen wird aber recht viel mit dem Grundgerüst Generator, etc. gemacht. Außerdem wird wieder die eingebaute Contextverwaltung genutzt:


public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<MyIdentityDbContext>(options =>
        options.UseSqlServer(config.GetConnectionString
        ("DefaultConnection")));
    services.AddIdentity<MyIdentityUser, MyIdentityRole>()
        .AddEntityFrameworkStores<MyIdentityDbContext>()
        .AddDefaultTokenProviders();
    services.AddMvc();
}

Wie baue ich das am besten um, um einen eigenen Service zu nutzen? Oder ist es empfehlenswert für Userdaten den eingebauten Service zu nutzen?
Ich bin noch etwas Flask-User (Python) gewöhnt, da war das extrem einfach und anpassbar, in ASP.NET kommt mir das alles immer ziemlich überladen vor.

Danke!

16.806 Beiträge seit 2008
vor 3 Jahren

Es wäre super, wenn Du Dir aneignest vorher mal die offizielle Doku zu lesen, bevor Du ein Thema erstellst. Auch wenn ich mich damit erneut wiederhole 😉
[Hinweis] Wie poste ich richtig?

Introduction to Identity on ASP.NET Core
Alle, ausnahmslos alle Fragen, die Du hier gestellt hast, sind in den ersten Kapiteln beantwortet.

Der Punkt "eigener Service" siehst Du in der Region "Customizing Identity".
Ob die Quelle nun eine Datenbank ist, wie es die Doku exemplarisch zeigt; spielt für den erweiterbaren Mechanismus keine Rolle.

Flask mit ASP.NET Identity zu vergleichen ist halt wie Trabbi vs. Porsche.

1.029 Beiträge seit 2010
vor 3 Jahren

Hi,

den Identity-Kram von Microsoft kann man zwar mit einer eigenen Datenzugriffstechnologie nutzen - es kann hier auch etwas umfangreicher werden.

Grundlegend:
Du musst einen eigenen IdentityStore schreiben, der (bei mir) folgende Schnittstellen implementiert:
IUserPasswordStore<IdentityUserEntity>, IUserClaimStore<IdentityUserEntity>, IRoleStore<IdentityRoleEntity>, IUserSecurityStampStore<IdentityUserEntity>, UserRoleStore<IdentityUserEntity>, IUserLoginStore<IdentityUserEntity>, IUserEmailStore<IdentityUserEntity>, IUserPhoneNumberStore<IdentityUserEntity>, IUserTwoFactorStore<IdentityUserEntity>, IUserLockoutStore<IdentityUserEntity>

Wie man das alles implementiert und anpasst - hängt prinzipiell von dir ab - aber die von Abt verlinkten Stellen waren bei mir vollkommen ausreichend um es auf meine Bedürfnisse mit eigenen Datenschnittstellen anzupassen.

Kann dir zwar ein Beispielprojekt verlinken - aber um ehrlich zu sein wird dich das nicht entscheidend weiter bringen, da es im Prinzip alles Boiler-Plate-Code ist um die bereits genannten Schnittstellen mit der eigenen Schnittstelle zu implementieren...

LG

16.806 Beiträge seit 2008
vor 3 Jahren

Der "kleinste" User Store ist

public class MyUserStore : IUserEmailStore<MyUser>, IUserPasswordStore<MyUser>
JimStark Themenstarter:in
309 Beiträge seit 2020
vor 3 Jahren

Hi,

danke erstmal euch.
Ein Beispiel für den Store wäre ja z.B. das https://docs.microsoft.com/de-de/aspnet/core/security/authentication/identity-custom-storage-providers?view=aspnetcore-3.1

Die Frage ist ob es sich rentiert.
Habe Identity jetzt soweit eingebunden, aber halt über serices.AddDbContext
Vielleicht belasse ich es erstmal für User in einem separaten Context, da es eh nur wenige User gibt und ein einziger Admin diese nur bearbeitet.

Danke euch beiden

JimStark Themenstarter:in
309 Beiträge seit 2020
vor 3 Jahren

Hier zu noch eine Frage:

Wenn ich die User SQLite Datei lösche und den Server neustarte kommt ein Fehler.
Die Identity Datenbank muss ich mit "Update-Database" mit der PM-Konsole initalisieren.
Kann ich das auch programmgesteuert machen, dass mein Programm die Datenbank erstellt wenn sie nicht vorhanden ist?
Oder wie macht man das wenn das Programm beim Kunden liegt und man es einrichten will ohne Migrations, etc.?

16.806 Beiträge seit 2008
vor 3 Jahren

Ne Sqlite Datei nimmt man prinzipiell gar nicht, weil Du normalerweise keinerlei Schreibrechte im ASP.NET Betriebsverzeichnis hast.
Den Rest kannst Du Dir selbst aus der EF Core Doku entnehmen. Alternativ eben nen ordentlichen DevOps Deployment Prozess beim Kunde.

Dahingehend auch mein Reminder, einfach mal die Doku zu lesen.
Da sind potentielle Lösungen für solche Szenarien beschrieben.