Comment ajouter des données personnelles aux Base d'authentification ASP.NET Core ?

De base il y a le nom, l'adresse email, la structure d'une application ASP.NET Core concernant l'authentification est déjà assez complète mais je souhaite y ajouter des données personnelles sur l'utilisateur âge ou date de naissance, adresse, localisation qu'il va pouvoir gérer dans son profile au sein de mon Application Web ASP.NET Core.

https://identityserver.io/
Authentification dans les application ASP.NET Core & Angular

Je crois que quasiment tout le travaille est déjà fait ...

Microsoft - Ajouter, télécharger et supprimer des données utilisateur personnalisées pour l’identité dans un projet ASP.NET Core

En continuant mes recherches, je trouve ce projet et cet auteur qui me semble bien avancé :

Mark Macneil - User Authentication and Identity with Angular, Asp.Net Core and IdentityServer
Ce qui est un petit peu ennuyeux pour ne pas dire plus, c'est la disparité de tous ces projets. Je clone

https://github.com/mmacneil/AngularASPNETCoreOAuth

et je m'intéresse précisément au projet suivant :

https://github.com/mmacneil/AngularASPNETCoreOAuth/tree/master/src/AuthServer

Car je souhaite également déployer une application d'Authentification pour authentifier des utilisateurs dans mes applications Angular.

Je lance la solution dans mon Visual Studio, jusque là tout vas bien, mais quand je souhaite créer la base de données, je vais dans la console Package Management Console :

PM> update-database

Et là ce sont des insultes jusqu' à ce que je comprenne que le package :

Microsoft.EntityFrameworkCore.Tools

N'est pas installé et pourtant cette commande en dépend, allons y installons ce package pour ce projet:

PM> Install-Package Microsoft.EntityFrameworkCore.Tools

Mais là pareil, un flot d'injures le tout en rouge dans ma PMC, jusqu'à ce que je mette à jour la version des packages ...

Mise à jour des packages autour d'EntityFrameworkCore  pour installer EntityFrameworkCore.Tools
Mise à jour des packages autour d'EntityFrameworkCore  pour installer EntityFrameworkCore.Tools

Cette fois, je vais enfin pouvoir exécuter la fameuse commande :

PM> update-database

Et bien non rien à faire ...

Update-database

Your startup project 'AuthServer' doesn't reference Microsoft.EntityFrameworkCore.Design. This package is required for the Entity Framework Core Tools to work. Ensure your startup project is correct, install the package, and try again.

Cette fois j'en ai ras le bol, je pars, je reviendrai demain ...

Le lendemain ... Reprenons calmement ...

J'installe le package Microsoft.EntityFrameworkCore.Design pour le projet principal AuthServer

Install package Microsoft.EntityFrameworkCore.Design

Je me positionne dans le répertoire de l'Infra :

PM> cd .\AuthServer.Infrastructure
PM> update-database
Build started...
Build succeeded.
More than one DbContext was found. Specify which one to use. Use the '-Context' parameter for PowerShell commands and the '--context' parameter for dotnet commands.
PM>

Là, on retourne chez l'auteur qui nous dit :

AuthServer.Infrastructure> dotnet ef database update --context AppIdentityDbContext
AuthServer.Infrastructure> dotnet ef database update --context PersistedGrantDbContext

et que l'on va traduire par la commande suivante dans la Console Package Management :

PM> update-database -context AppIdentityDbContext
Build started...
Build succeeded.
DesignTimeDbContextFactory.Create(string): Connection string: Server=(localdb)\mssqllocaldb;Database=AuthServer;Trusted_Connection=True;MultipleActiveResultSets=true
Applying migration '20190403041320_initial'.
Done.
PM>

La documentation est Ici :

Microsoft EF Core - Migrations

Aaaahhhh c'est la lutte quand même, encore un machin très microsoftien c'est la multiplication des fenêtres d'exécution (des consoles) entre PowerShell Package Management Console ou même Windows Console avec dotnet ...

Ma Base de donnée d'Authentification des Utilisateurs est enfin crée :


ASP.NET Core DB
ASP.NET Core DB - Base d'Authentification des utilisateurs

Il ne faut pas oublier d'exécuter la deuxième commande :

PM> update-database -context PersistedGrantDbContext

Et pour le message :

Method not found: 'Microsoft.EntityFrameworkCore.Metadata.Builders.IndexBuilder Microsoft.EntityFrameworkCore.Metadata.Builders.EntityTypeBuilder`1.HasIndex(System.Linq.Expressions.Expression`1<System.Func`2<!0,System.Object>>)'.

La solution préconisée est  Ici.

C'est de bien mettre à jour tous vos projets en vous assurant qu'ils utilisent la même version de IdentityServer ... Sinon, Beug !

PM> update-database -context PersistedGrantDbContext
Build started...
Build succeeded.
Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core 3.1.2 initialized 'PersistedGrantDbContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (26ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      SELECT 1
Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (22ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      SELECT OBJECT_ID(N'[__EFMigrationsHistory]');
Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      SELECT 1
Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (0ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      SELECT OBJECT_ID(N'[__EFMigrationsHistory]');
Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (2ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      SELECT [MigrationId], [ProductVersion]
      FROM [__EFMigrationsHistory]
      ORDER BY [MigrationId];
Microsoft.EntityFrameworkCore.Migrations[20405]
      No migrations were applied. The database is already up to date.
No migrations were applied. The database is already up to date.
Done.

PM>

Voilà pour la partie, Serveur d'Authentification.

Authentification - Partie cliente avec Angular

Cette fois, je prends mon Visual Studio Code et je viens ouvrir le répertoire :

\Visual Studio 2019\Samples\AngularASPNETCoreOAuth\src\Spa\oauth-client

Et je viens exécuter la commande dans un Terminal :

ASP.NET Core DB
Client Angular - Visual Studio Core pour l'install de Angular/CLI

Je dois installer Angular CLI pour mon application cliente :

PS : \AngularASPNETCoreOAuth\src\Spa\oauth-client> ng install @angular/cli

Pour rappel l'installation d'Angular CLI se distingue par l'existence du répertoire :

\AngularASPNETCoreOAuth\src\Spa\oauth-client\node_modules\@angular

Une fois Angular/CLI installé, je peux lancer la compilation de mon application Angular :

PS : \AngularASPNETCoreOAuth\src\Spa\oauth-client> ng serve

Exécution en mode Debug de la partie Angular

Il me faut créer un fichier de configuration de l'exécution du mode Debug :

Angular Run en mode Debug
Angular Run en mode Debug

N'oubliez pas de modifier le port de communication proposé par défaut pour une application web : 8080 par le port 4200 pour les applications Web Angular.

Angular Run en mode Debug

Vous pouvez enfin cliquer sur le petit triangle vert et obtenir le résultat suivant en exécutant la partie cliente SPA (Single Page Application) :

Angular Authentification sur un Serveur ASP.NET Core avec IdentityServer
Angular Authentification sur un Serveur ASP.NET Core avec IdentityServer

Je me "Signup" avec un UserName : "aaa", je me Login et j'obtiens l'accès  à la "Top Secret Area" :

Angular Authentification sur un Serveur ASP.NET Core avec IdentityServer - Top Secret Area

Voilà, il est vraiment super cet exemple et très complet et mériterait un bisou sauf que nous sommes en période de Corona.

Thank you very much Mark Macneil

Mais vous l'avez vu pour aller au bout de cette application ,il y a plein de pièges que j'ai déjoués pour nous alors n'hésitez pas à cliquer partout, à commenter, à compléter.

La prochaine fois nous verrons comment ajouter des données autour de "MemberIdentity" car moi j'aimerais bien savoir où il habite mon utilisateur ;-)

Let's go to the beach!

Ah non, mince, c'est Corona, Grrrrr.

Je vous propose de poursuivre cette exploration des Bases de Données d'Authentification dans ASP.NET C# car cela concerne plus les applications Web.

ASP.NET Core comparaison des structures des Bases de données IdentityServer