Hallo,
ich bin aktuell dabei mich ein wenig in die API-Entwicklung mit ASP.Net ,(Core) um genau zu sein, einzuarbeiten.
Ich bastle aktuell eine Art Authentifizierungssystem. Man loggt sich z.B. mit Benutzer und Passwort ein, und mit EF-Core gleiche ich die Daten mit der Datenbank ab.
Jetzt möchte ich, falls eine Authentifizierung mit Benutzer und Passwort erfolgreich war, einen Token (Guid) generieren der solange gültig ist, wie der ASP.NET API Server läuft.
Den Token benutzt man, um später einen anderen API Endpunkt aufzurufen und sich bei diesem zu authentifizieren.
Meine Idee also: Eine Klasse TokenManager basteln, die ein Dictionary<DbUser, Guid> enthält und diese als Singleton im Service Provider registrieren.
Authentifiziert sich ein Benutzer also mit Benutzername und Passwort erfolgreich, wird diese Benutzer-Entität (DbUser) in dem TokenManager im Dictionary zusammen mit einem neu-generierten Guid festgehalten.
Authentifiziert sich ein Benutzer mit dem Token bei einem anderen Endpunkt der API, soll in diesem Endpunkt auch wieder per Singleton auf den TokenManager zugegriffen werden und das Dictionary eben nach dem Guid durchsucht werden. Wird der Token gefunden, ist die Authentifizierung erfolgreich, wenn nicht, dann nicht und es kann entsprechend reagiert werden.
Auf diese Weise habe ich es schon ausprobiert, leider musste ich feststellen, dass es nicht möglich ist meinen DbContext in einer Singleton Klasse per Dependency Injection zu injizieren.
Was Dependency Injection angeht bin ich auch noch nicht so bewandert. Ich weiß es gibt verschiedene Arten von DI. Ich habe versucht die Construktor DI zu nutzen
Meine Singleton Klasse TokenManager hat im Konstruktor den DbContext Parameter. Leider bekomme ich dann aber immer folgende Fehlermeldung: System.InvalidOperationException: Cannot consume scoped service 'API.Contexts.MyContext' from singleton 'API.Services.TokenManager'.
Wenn ich statt AddSingleton, AddTransient benutze, funktioniert die DI prima und ich kann den DbContext nutzen. Nur bei Singleton geht es nicht. Transient nutzt mir aber nichts, weil das Objekt dann ja immer neu erstellt wird und die Tokens dann futsch sind.
Ich könnte jetzt natürlich anfangen und den TokenManager nicht als Service registrieren sondern einfach eine statische Singleton-Variable selbst anzulegen, aber ich will mal wissen was ihr davon haltet und ob es vielleicht eine einfachere bzw. sauberere Lösung gibt.
Danke im Voraus und für's lange durchlesen.
Gruß seh
ich bin aktuell dabei mich ein wenig in die API-Entwicklung mit ASP.Net ,(Core) um genau zu sein, einzuarbeiten.
Ich bastle aktuell eine Art Authentifizierungssystem. Man loggt sich z.B. mit Benutzer und Passwort ein, und mit EF-Core gleiche ich die Daten mit der Datenbank ab.
Jetzt möchte ich, falls eine Authentifizierung mit Benutzer und Passwort erfolgreich war, einen Token (Guid) generieren der solange gültig ist, wie der ASP.NET API Server läuft.
Den Token benutzt man, um später einen anderen API Endpunkt aufzurufen und sich bei diesem zu authentifizieren.
Meine Idee also: Eine Klasse TokenManager basteln, die ein Dictionary<DbUser, Guid> enthält und diese als Singleton im Service Provider registrieren.
Authentifiziert sich ein Benutzer also mit Benutzername und Passwort erfolgreich, wird diese Benutzer-Entität (DbUser) in dem TokenManager im Dictionary zusammen mit einem neu-generierten Guid festgehalten.
Authentifiziert sich ein Benutzer mit dem Token bei einem anderen Endpunkt der API, soll in diesem Endpunkt auch wieder per Singleton auf den TokenManager zugegriffen werden und das Dictionary eben nach dem Guid durchsucht werden. Wird der Token gefunden, ist die Authentifizierung erfolgreich, wenn nicht, dann nicht und es kann entsprechend reagiert werden.
Auf diese Weise habe ich es schon ausprobiert, leider musste ich feststellen, dass es nicht möglich ist meinen DbContext in einer Singleton Klasse per Dependency Injection zu injizieren.
Was Dependency Injection angeht bin ich auch noch nicht so bewandert. Ich weiß es gibt verschiedene Arten von DI. Ich habe versucht die Construktor DI zu nutzen
Meine Singleton Klasse TokenManager hat im Konstruktor den DbContext Parameter. Leider bekomme ich dann aber immer folgende Fehlermeldung: System.InvalidOperationException: Cannot consume scoped service 'API.Contexts.MyContext' from singleton 'API.Services.TokenManager'.
Wenn ich statt AddSingleton, AddTransient benutze, funktioniert die DI prima und ich kann den DbContext nutzen. Nur bei Singleton geht es nicht. Transient nutzt mir aber nichts, weil das Objekt dann ja immer neu erstellt wird und die Tokens dann futsch sind.
Ich könnte jetzt natürlich anfangen und den TokenManager nicht als Service registrieren sondern einfach eine statische Singleton-Variable selbst anzulegen, aber ich will mal wissen was ihr davon haltet und ob es vielleicht eine einfachere bzw. sauberere Lösung gibt.
Danke im Voraus und für's lange durchlesen.
Gruß seh