Authentifizierung und Autorisierung in Blazor WebAssembly mit Database First Approach

Aug 25 2020

Zusammenfassung meines Problems

Mein Projekt ist komplexer, aber hier ist mein Problem auf einer sehr grundlegenden Ebene. Ich habe ein Blazor WebAssembly-Projekt, in dem ich nur grundlegende CRUD-Operationen ausführe.

Ich habe auch eine kleine Datenbank und sagen wir, ich habe zwei Tabellen Usersund Roles. Was ich tue, ist, ihre Klassen in Database-First-Manier zu erstellen, indem Scaffold-DbContextich diesen Befehl verwende und für das SharedProjekt ausführe, da ich diese Klassen auch von beiden Serverund von ClientProjekten aus erreichen möchte .

Wenn ich versuche, Individual User Accountsbeim Erstellen eines Blazor WebAssembly-Projekts die Registerkarte Authentifizierung zu verwenden , werden die Datenmodelle auf dem Server erstellt. Das heißt, ich kann von ClientProject aus nicht auf meine Tabellen zugreifen . Sie müssen drin sein Shared. Es basiert auch auf Code-First. Ich möchte keine Migrationen verwenden.


Was ich versucht habe

Ich habe versucht, ein identisches Projekt mit Individual User AccountsProjekten zu erstellen , aber meine UsersKlasse erbt IdentityUserund mein DbContext erbt, ApiAuthorizationDbContextaber das Problem beginnt hier.

Ich kann kein ApiAuthorizationPaket von NuGet hinzufügen , da das freigegebene Projekt nicht mit .NetStandard 2.1 kompatibel ist.

Auch das Ändern des Standards des gemeinsam genutzten Projekts hat nicht funktioniert.


Einige Fragen

  • Kann ich nicht einfach meine Benutzertabelle zur Freigabe hinzufügen und die Identität aus dieser Tabelle verwenden? (Da es sich nur um eine einzelne Tabelle einer größeren Datenbank handelt)

  • Benötige ich dafür zwei Datenbanken? Eine für Identität, eine für den Rest der Anwendung?

  • Muss ich Identity für die Authentifizierung und Autorisierung verwenden? Was kann ich noch verwenden? Oder kann ich eine benutzerdefinierte verwenden, bei der ich sie wie zuvor beschrieben verwenden kann (Modelle im freigegebenen Projekt haben)?


Mein Ziel

Ich möchte Benutzer mit [Authorize]Eigentum autorisieren . Da ich die Registrierung nicht durchführen kann, kann ich nicht fortfahren.

Antworten

1 HenkHolterman Aug 25 2020 at 20:13

Verwenden Sie 2 DbContexts. Die Identitätstabellen (Ihre oder ASP.NET) sollten nicht Teil der Shared- oder Client-Projekte sein.

Ich möchte Benutzer mit der Eigenschaft [Authorize] autorisieren

Die eigentliche Autorisierung erfolgt auf dem Server, nichts im Client ist sicher. Haben Sie sich die vollständige (JWT-basierte) Implementierung in der Vorlage angesehen?

  • Kann ich nicht einfach meine Benutzertabelle zur Freigabe hinzufügen und die Identität aus dieser Tabelle verwenden? (Da es sich nur um eine einzelne Tabelle einer größeren Datenbank handelt)

Nein, Identität benötigt die Basisklasse. Und Ihre Client-App benötigt (und sollte) die meisten ihrer Eigenschaften nicht sehen.

  • Benötige ich dafür zwei Datenbanken? Eine für Identität, eine für den Rest der Anwendung?

Das ist der beste Weg. Beachten Sie, dass Sie 2 DbContexts für 1 physische Db haben können.

Verknüpfen Sie den Benutzer bei Bedarf mit einer einfachen Benutzer-ID (keine Nav-Eigenschaft).