Authentification et autorisation dans Blazor WebAssembly avec Database First Approach

Aug 25 2020

Résumé de mon problème

Mon projet est plus complexe mais voici mon problème au niveau très basique. J'ai un projet Blazor WebAssembly dans lequel je ne fais que des opérations CRUD de base.

J'ai aussi une petite base de données et disons que j'ai deux tables Userset Roles. Ce que je fais est de créer leurs classes à la manière de la base de données d'abord, en utilisant Scaffold-DbContextet j'exécute cette commande sur le Sharedprojet car je souhaite également accéder à ces classes à partir des deux Serveret des Clientprojets.

Lorsque j'essaye d'utiliser l' Individual User Accountsonglet Authentification lors de la création d'un projet Blazor WebAssembly, cela crée les modèles de données sur le serveur. Ce qui signifie que je ne peux pas accéder à mes tables depuis ClientProject. Ils doivent être dedans Shared. Il est également basé sur le code d'abord. Je ne veux pas utiliser de migrations.


Ce que j'ai essayé

Ce que j'ai essayé de faire est de créer un projet - presque - identique avec des Individual User Accountsprojets mais ma Usersclasse hérite IdentityUseret mon DbContext hérite ApiAuthorizationDbContextmais le problème commence ici.

Je ne peux pas ajouter de ApiAuthorizationpackage à partir de NuGet car il indique que le projet partagé n'est pas compatible avec .NetStandard 2.1.

La modification de la norme du projet partagé n'a pas non plus fonctionné.


Quelques questions

  • Est-ce que je ne peux pas simplement ajouter ma table d'utilisateurs sur le Shared et utiliser l'identité de cette table? (Comme il ne s'agit que d'une table unique d'une base de données plutôt plus grande)

  • Ai-je besoin de deux bases de données pour cela? Un pour l'identité, un pour le reste de l'application?

  • Dois-je utiliser l'identité pour l'authentification et l'autorisation? Que puis-je utiliser d'autre? Ou puis-je utiliser un modèle personnalisé où je peux l'utiliser comme je l'ai décrit précédemment (avoir des modèles dans un projet partagé)


Mon but

Je veux autoriser les utilisateurs avec la [Authorize]propriété. Comme je ne peux pas effectuer l'inscription, je ne peux pas continuer.

Réponses

1 HenkHolterman Aug 25 2020 at 20:13

Utilisez 2 DbContexts. Les tables d'identité (la vôtre ou ASP.NET) ne doivent pas faire partie des projets partagés ou clients.

Je souhaite autoriser les utilisateurs avec la propriété [Authorize]

La véritable autorisation se produit sur le serveur, rien dans le client n'est sûr. Avez-vous examiné l'implémentation complète (basée sur JWT) dans le modèle?

  • Est-ce que je ne peux pas simplement ajouter ma table d'utilisateurs sur le Shared et utiliser l'identité de cette table? (Comme il ne s'agit que d'une table unique d'une base de données plutôt plus grande)

Non, Identity a besoin de la classe de base. Et votre application cliente n'a pas besoin (et ne devrait pas voir) la plupart de ses propriétés.

  • Ai-je besoin de deux bases de données pour cela? Un pour l'identité, un pour le reste de l'application?

C'est la meilleure façon. Notez que vous pouvez avoir 2 DbContexts pour 1 Db physique.

Lien vers l'utilisateur avec un simple UserId (pas de propriété Nav) si nécessaire.