IdentityServer4 Manage List of Users

C'est toujours la même question car je n'ai pas trouvé de réponse, comment manager mes utilisateurs avec IdentityServer4 ? Quelle est la frontière entre IS4 et .NET Identity. Qui ressemble, pour les anciens, à l'ASP.NET DB.

ASP.NET Core Identity - Authentification

Je suis surpris que l'on nous laisse entre les mains des créateurs de l'IdnetityServer4 avec une version payante de l'AdminUI (version à 500 L, oui c'est de l'english, pour la moins chère) qui en plus ne correspond pas à mon besoin car je souhaite simplement une DataView ou une GridView sur la tables de mes utilisateurs pour manager mes Users et leurs rôles au sein de mon application Web ASP.NET Core.

Je n'ai pas besoin de tout le tintouin configuration des clients c'est déjà fait, Policy, Claims, ... bref je vais la développer cette Interface de Gestion des Utilisateurs. Mais avant de définir les specs de mon projet, je suis prudent et je regarde plus avant ce que je peux faire avec IdentityServer4 ...

Role Based Security in an ASP.NET Core Application
DotNetCurry ! Ils ont de l'humour ces gars là, vous ne trouvez pas ! Avec ce nom vous pensez qu'ils sont indiens, certainement.

AspNetCore Identity - Tables

Pour enregistrer un utilisateur, il faut commencer par créer des Rôles afin d'enregistrer l'utilisateur avec son Rôle.

AspNetCore Identity - Roles cretation

Ce qui se traduit dans la base de données par le contenu de la Table AspNetRoles suivant :

AspNetCore Identity - AspNetRoles

Et dans la Table AspNetUser Roles par :

AspNetCore Identity - AspNetRoles

On a fait le tour de la gestion des Rôles mais il faudrait que l'on puisse ajouter un User dans un Rôle ou retirer un User d'un Rôle.

Et pour continuer, voici l'excellent site :

YOGIHOSTING » ASP.NET CORE » HOW TO WORK WIT...
Finalement j'ai eu du mal à trouver mais là il y a tout, tout ce que je veux pour réaliser mon application idéale de Gestion des Utilisateurs de mon application Web.

https://www.yogihosting.com/aspnet-core-identity-create-read-update-delete-users/

Merci à cette équipe et oui il s'agit bien de toute une équipe ...

ABOUT THE AUTHOR
This article has been written by the Technical Staff of YogiHosting. Check out other articles on "ASP.NET Core, jQuery, EF Core, SEO, jQuery, HTML" and more.


Maintenant, il ne reste plus qu'à intégrer tout cela dans mon projet StsIdentityServer4.

Il y a un bel exemple de poursuite du développement sur la base d'un IdentitytServer4 c'est ici :

GitHub - BenjaminAbt / Samples.AspNetCore-IdentityServer4

Et sinon, nous avons maintenant notre propre IdentityServer4 avec Gestion des Utilisateurs, n'hésitez pas à nous contacter. Nous mettrons surement prochainement en ligne les codes sources si vous nous en faites la demande (gentiment ;-).

IdentityServer4 How To Manage Users and Roles and Community

Evidemment, pour répondre à ce besoin, il y a le site payant avec leur AdminUI mais je suis déçu, je n'ai passé que très peu de temps à m'enregistrer et a lire la documentation mais surtout c'est une "application de poste". Je souhaitais une application web de management de mes utilisateurs.

Identity Server - ASP.NET Core solution
IdentityServer4 - Site Commercial - ASP.NET Core

Voici le site de l'AdminUI :

IdentityServer4 - AdminUI
IdentityServer4 - AdminUI ~ 500 $

J'ai installé les templates, dedans il y en a un qui s'appelle is4admin mais si vous croyez qu'il y a la moindre UI de Gestion des utilisateurs et des Roles là dedans, je crois que c'est raté !

https://github.com/IdentityServer/IdentityServer4.Templates

Si j'installe tout et si je fais :

http://localhost:5000/admin

Il ne se passe rien ! Pas d'Admin !

IdentityServer4 - ASP.NET Core solution
is4aspid - IdentityServer4 - ASP.NET Core

Les sources de ce serveur d'authentifications sont Ici :

https://github.com/IdentityServer

Une fois entré avec The default users are alice/bob, password: Pass123$

On ne peut plus rien faire, tout le site ne consiste qu'à gérer les configurations des sources de IdentityServer4, donner quelques bases sur le configuration de votre client qu'il soit MVC, API, Angular ou autre et puis c'est tout.

IdentityServer4 - ASP.NET Core solution
Login into is4aspid project an ASP.NET Core Solution

J'essaye de titiller les différents contrôleurs : Grants :

IdentityServer4 - ASP.NET Core solution
IdentityServer4 - ASP.NET Core - Samples for Grants

Aucun exemple pour découvrir comment attribuer des Grants à Alice Smith. Grrr. 
Franchement avec tous ces trucs UI is4ui et autres, je pensais trouver mieux, il n'y a pas même un formulaire de Register.

Tout le reste consiste à nous montrer que leur Server d'Identité fonctionne mais de façon pratique rien n'est codé du côté UI. Il faut aller acheter sur le site :


Dont la documentation est fournie Ici :


Alors si je vais voir ailleurs avec les mots clefs : AdminUI for IdentityServer4 ...
un peu plus loin il y a :


Mais le gars Skoruba,, il plombe son projet avec tout un tas de trucs c'est très compliqués ça va surement devenir payant.

Il y a lui, Asad Sahi :

https://github.com/asadsahi/AspNetCoreSpa

Il y réussi a installer un IdentityServer sur une machine mais bon ... c'est tout Grrrr.

Ou encore cette page répertoire des projets OpenSource

https://awesomeopensource.com/projects/identityserver4
C'est une sorte de répertoire des projets Open Source : "The Top 28 Identityserver4 Open Source Projects" j'y retrouve les projets que je connais déjà.

Skoruba/IdentityServer4.Admin
Trop compliqué ! Et puis il met son nom partout Skoruba par ci Skoruba par là, ça ne fait pas très pro en tous les cas il y a du code plein de code.

Si j'avais un tel projet à créer et à développer je l'appellerai IdentityServer4.AdminUI

Franchement quand je regarde :

https://dotnetnew.azurewebsites.net/template/IdentityServer4.Templates/IdentityServer4.Admin

J'ai l'impression que l'AdminUI est dedans ....

J'ai créé un nouveau projet à partir de la commande suivante :

PS>dotnet new is4admin

Et j'ai créé ainsi un projet un peu différent est ce la réinstalle du Template ... mystère.

J'ai deux bases de données :

{
  "ConnectionStrings": {
    "Users": "Data Source=AspIdUsers.db;",
    "Configuration": "Data Source=IdentityServer.db;"
  }
}

Donc maintenant, j'en suis sûr je me suis trompé de template certainement en instanciant le premier exemplaire.

IdentityServer4 AdminUI

J'ai enfin accès en instanciant un projet avec la commande. Je me lance dans une exploration rapide.
Exécution de l'application :

IdentityServer4 AdminUI - ASP.NET Core
IdentityServer4 AdminUI - ASP.NET Core

Alors où vais-je me retrouver quand j'aurais cliqué sur ce lien ? C'est une DLL intégrée certainement avec de l'obfuscationdans. Le site principal dit :

The community edition is intended for testing IdentityServer integration scenarios and is limited to localhost:5000, SQLite, 10 users, and 2 clients. The community edition is not suitable for production.

See identityserver.com for more information about AdminUI or to request a trial license.


Ok Start !

IdentityServer4 AdminUI découverte
IdentityServer4 AdminUI - Découverte

Je me retrouve enfin dans l'Administration du Serveur IdentityServer4, ce n'est pas trop tôt.

IdentityServer4 AdminUI - Découverte enfin l'UI

Je peux alors ajouter un utilisateur :

IdentityServer4 AdminUI - Ajouterun Utilisateur
IdentityServer4 AdminUI - Ajouter un Utilisateur

Je passe par l'onglet Claim Types un truc intéressant une liste de Claims je choisi birthdate je peux la rendre obligatoire et éditable par l'utilisateur par contre au moment de sauver :

IdentityServer4 AdminUI - Claim Types

Grrrr ça paraissait simple j'oblige les nouveaux utilisateur à entrer leur date de naissance et je la rends éditable ... mais non ... je verrai ça plus tard.

Du coup je me dis que je devais supprimer tous les utilisateur pour modifier la structure de la base mais c'est pas ça GRRRR.

Je clique par hasard sur Active et je restore mon utilisateur.

IdentityServer4 AdminUI - Restore un utilisateur

Voilà un tour super rapide de l'interface, c'est bien ce que j'attends de l'AdminUI d'IdentityServer4 mais c'est dommage parce que je pensais bien que ce boulot était fait et non payant.

En plus sur ce genre de produit, c'est toujours la même chose, ils déclinent dans toutes les langues sur toutes les plateformes, dans tous les langages de programmation et cela devient bien trop compliqué.

Pour aller plus loin, encore un peu de lecture :

Visitez notre implémentation de l'IdentityServer4

Pour visiter en ligne, notre implémentation, voici l'IdentityServer4 de SoDevLog :

Sur ce formulaire d'enregistrement de l'utilisateur vous pouvez constater qu'il y a des champ supplémentaire que nous désirons recueillir de la part de nos utilisateurs :
  • Date de naissance
  • Société
  • Addresse
Suivant la façon dont l'utilisateur rempli ces champs, nous pouvons immédiatement en déduire ses intentions.

Nous cherchons à acquérir de vrais clients motivés qui doivent passer un peu de temps à remplir correctement ces champs.

Découvrons le projet Open Source Myrtille avec Visual Studio 2019

Il s'agit d'une application Web permettant de vous connecter aux ordinateurs à distance. Un RDP (Remote Desktop Protocol) en application Web.

Voici l'adresse du Github :

GitHub - cedrozor/myrtille

On nous dit qu'il faut Visual Studio 2017. Alors peut-on ouvrir la solution avec Visual Studio 2019 Community... ?

Je clone le répertoire sur mon disque dur grâce à GitHubDesktopSetup que je viens d'installer :

Github Clone myrtille

J'ouvre mon Visual Studio 2019 Community et j'ouvre la solution :

..\Visual Studio 2019\GithubClone\myrtille\Myrtille.sln

C'est toujours un moment délicat, soit tout va bien se passer et on va pouvoir continuer le développement, browser les sources regarder les modèles de données, soit l'ouverture du projet crash et il va falloir remédier avant d'imaginer utiliser les codes sources.

Ici, avec myrtille, l'installeur n'est pas compatible avec Community mais ça on le sait :

Installeur de myrtille incompatible avec VS Community

Pour le reste tout à l'air de se passer correctement.

Installeur de myrtille incompatible avec VS Community

Le chargement du projet myrtille me demande d'installer "Desktop development with C++".


Allons y ! C'est long, l'installation de la totalité de la chaîne et des outils de développement en C++.

Visual Studio 2019 Community se ferme automatiquement. Le processus d'installation sur ma machine actuelle prend environ 7 à 8 minutes. Visual se réouvre automatiquement avec un message "The installation has completed".

Me voilà avec un projet de développement myrtille :

Myrtille sous Visual Studio 2019 Community
Myrtille sous Visual Studio 2019 Community

Tout ceci m'a l'air très prometteur pour faire une incursion dans les technologies du projet. Si j'étais bourin, je ferais bouton droit sur la solution "Rebuild solution" mais je n'irais pas loin.

Essayons de voir ce qu'il manque en parcourant les références des différents projets. Le framework de myrtille c'est le .NET Framework 4.5. Je lance un coup de DotNetVersion sur ma machine de développement :

DoNet Version

Oups ... sur ma machine de DEV actuelle, je passe du 4.0.0.0 au 4.7.03062 ça n'est pas bon pour myrtille. La question est comment passer de .NET Framework 4.5 au .NET Framework 4.7 d'autant que je travaille actuellement sur cette machine avec .NET Core 3.0 ... 

Pour les amateurs de salmigondis 


En gros, il me faudrait installer une nouvelle machine (ancienne plutôt car 4.5 est un framework qui n'est plus supporté par le .NET Standard 2.1 cf. le tableau). 


La migration de .NET Framework 4.5 vers .NET Core c'est peut être la solution mais dans ce cas; il y a du travail. Attention la dette technique augmente.

Installer un site web sur une Machines Virtuelles dans l'Azure

Je souhaite configurer mes sites web dans l'Azure.  il me faut installer des machines virtuelles leur attribuer des adresses IP fixes publique et leur attribuer un nom de sous domaine. En suite installer IIS sur les machines virtuelle et déployer les sites que je souhaite installer.

Tous les éléments

Seulement voilà, suite à une manipulation hasardeuse, j'ai supprimé un truc que je ne trouvais pas utile et je perds ma machine virtuelle SODEVLOG-002 en effet elle se retrouve sans adresse IP publique. Je vais rectifier tout ça.

Plus d'adresse IP publique

Dissocier de l'interface réseau

Ajouter une légende
Quand tout va bien on a ceci :

Machine Vistuelle avec adresse IP publique

Ce qui ne va pas c'est cela :

Plus de Machine virtuelle associée à mon adresse IP

Le souci, c'est que le bouton Associer vous laisse pantois :

Adresse IP Publique Associée à Aucun élément disponible

Mais ce n'est pas là qu'il faut associer, ce qu'il faut associer c'est la machine virtuelle à l'interface réseau :

Associer une adresse IP publique à une machine virtuelle dans l'Azure

En procédant comme suit :

Ajouter une légende

Voilà maintenant ma machine virtuelle à retrouver son adresse IP publique. Normalement si tout se passe bien, vous n'avez pas à faire cette manipulation mais je la montre ici car elle peut être utile. Les suppressions intempestives sont très vites exécutées dans l'Azure.

Accéder à un site Web derrière l'IIS d'une Machine Virtuelle

Une fois la machine parfaitement configurée avec sont adresse IP fixe et publique, il ne faut pas oublier dans l'Azure de réaliser les manipulations suivantes pour donner l'accès à aux ports https :

Configuration des ports HTTP et HTTPS d'une machine virtuelle dans l'Azure

Voilà, ce n'est pas parce que c'est dans l'Azure que c'est plus facile, certes l'interface de configuration, votre tableau de bord Azure vous aide en vous montrant les paramètres à configurer mais toutes les manipulations sont à réaliser comme sur une machine réelle.


C'est quoi Azure Key Vault ?

Parmi les choses à découvrir, on me parle de Key Vault dans l'Azure. Alors allons à l'essentiel et découvrons rapidement ce qu'est que le Coffre de clés Azure Key Vault.

Aure Key Vault

D'autant que lorsque l'on tombe sur les pages marketing de Microsoft, ce n'est pas forcément très clair : "Vous disposez d'un contrôle complet, sans effort, Key Vault ne nécessite ni logiciel de gestion de clés." Cette phrase est incertaine et n'apporte rien, ou pas grand chose, bref ce marketing est bien inutile.

Microsoft - A propos d'Azure Key Vault

On y parle de gestion des secrets, on se croirait dans une émission de télé ... Globalement, il s'agit de centraliser et de sauvegarder dans le Cloud Azure les "secrets des applications". Mais alors quels sont ces secrets que l'on peut cacher ?

Voici l'exemple d'une chaîne de connexion qui se trouve sauvegardée dans le fichier Web.config ou appsetting.json d'une application Web, il faut sécuriser cette partie de l'application d'autant plus que le couple user/password peut être "en clair" dans ces fichiers. Et bien là, vous pouvez stocker cette chaîne de connexion dans Key Vault.

Pour aller plus loin et avoir une idée rapide des détails techniques d'implémentation, voici la page suivante :

Microsoft - Authentification, requête et réponses
On y parle d'URL, d'API REST et des moyens de mettre en oeuvre la sécurité autour de Key Vault.

Vous pourrez utiliser Postman, cet outil qui permet de simuler une application qui fait des requêtes REST sur une API.

Donc pour finir, voici comment utiliser : l'Azure REST API Reference

Microsoft - Azure REST API Reference

Pour aller encore plus avant, je vais maintenant directement sur mon Portail Azure pour créer un Coffre de clés :

Mon Portail Azure - KeyVault
Mon Portail Azure - KeyVault

Je clique sur +Ajouter :

Gérer les Key Vault dans mon Portail Azure
Gérer les Key Vault dans mon Portail Azure

Voilà, ici j'ai des informations sur la Création d'un coffre de clés :

Azure - Créer un coffre de clés

Par la suite, je vais devoir choisir la Stratégie d'accès :


Azure Key Vault - Stratégie d'accès 

Puis le wizard me conduit vers la Mise à niveau :

Azure Key Vault - Stratégie d'accès

Enfin, je peux créer une première balise qui va me permettre de "sécuriser", de crypter une valeurs que je pourrais en suite utiliser dans mes applications en utilisant l'API REST d'Azure.

Azure Key Vault - Balises

Je ne peux pas aller plus loin sans m'engager dans l'utilisation et le paiement de ce service. Je vais donc ma'arrêter là mais je pense que comme moi vous avez compris comment et à quoi sert Azure KeyVault.

Mais voilà, nous venons de faire un tour rapide de ce qu'est Azure Key Vault, le coffre de clés pour sécuriser les informations critiques de vos applications.

Mise à jour en septembre 2020 
Je me pose la question de savoir si ce n'est pas exactement la même chose proposée gratuitement par GitHub ... Lorsque vous avez créé une "Organization" et que vous parcourez l'item "Secrets", comme ceci :

GitHub - Organization - Secrets

Vous avez la possibilité de créer des secrets... chut, un secret est un secret ! A creuser, mais il me semble bien que oui ;-)

Don't forget to go to the beach!

Memory leaks ou fuites mémoires, comment trouver l'origine d'une fuite mémoire ?

C'est important, pour tout développement logiciel, de mettre en place une bonne stratégie de logs et une bonne stratégie d’éradication des fuites mémoires. Sans quoi, le développement peut ne jamais aboutir car il y aura toujours des bugs ou des fuites mémoire que l'équipe de développement mettra un temps très important à corriger.

Aussi parmi les outils qui permettent d'aboutir dans le recherche de fuites mémoire sous Windows j'ai oublié WinDgb qui existe toujours.

WinDbg - Preview

Aussi, je ne savait pas que l'on pouvait utiliser WinDbg (Windows Debuggeur) pour chercher l'origine d'une fuite mémoire, je prends note ici de cet excellent article de Mathias Montantin :

Blog .NET -  Trouver l’origine d’une fuite mémoire avec WinDbg

WinDbg se trouve dans :

Microsoft - Hardware Dev Center - Dowload Debugging Tools for Windows



Croyez-moi, C'est toujours bon à savoir ;-)

IdentityServer4 Client Angular comment passer de Http à Https

Comment installer mon application Angular CLI derrière https au lieu http ? Je trouve la solution en compilant les informations qui sont dans les deux pages suivantes :

Running Angular CLI over HTTPS with a Trusted Certificate

Using Angular CLI to serve over https locally

Mais je trouve que ces deux pages sont incomplètes toutes les deux. Du coup j'ai envie de prendre quelques notes.

Avec OpenSSL on génère le Certificat server.crt et la Clef server.key. J'exécute le bash suivant :

Génération du Certificat et de la Clef associée
Génération du Certificat et de la Clef associée pour servir Angular derrière Https

Avec PowerShell, j'exécute le bash generate.sh voici le fichier generate.sh 

#!bin/bash

openssl req \
    -newkey rsa:2048 \
    -x509 \
    -nodes \
    -keyout server.key \
    -new \
    -out server.crt \
    -config ./openssl-custom.cnf \
    -sha256 \
    -days 365

Voici le fichier openssl-custom.cnf :

[req]
default_bits = 2048
prompt = no
default_md = sha256
x509_extensions = v3_req
distinguished_name = dn

[dn]
C = US
ST = KS
L = Olathe
O = IT
OU = IT Department
emailAddress = webmaster@example.com
CN = localhost

[v3_req]
subjectAltName = @alt_names

[alt_names]
DNS.1 = *.localhost
DNS.2 = localhost

Que vous devez mettre à votre sauce.

Ensuite, On l'installe le certificat sur le serveur en double cliquant sur le fichier serveur.crt de la façon suivante :

Génération du Certificat et de la Clef associée pour servir Angular derrière Https
Angular & Https 

Il faut installer le Certificat dans le bon "entrepôt" dans Trusted Root Certificat Authorities

Génération du Certificat et de la Clef associée pour servir Angular derrière Https
Génération du Certificat et de la Clef associée pour servir Angular derrière Https

Dans l'application Angular, créer un répertoire "ssl" sous la racine de l'application, placer le certif et la clef dans ce répertoire.

On installe la commande pour servir l’application à l'adresse https://localhost:4200/

\Samples\AngularASPNETCoreOAuthApp\AngularASPNETCoreOAuth\src\Spa\oauth-client\package.json

{
  "name": "oauth-client",
  "version": "0.0.0",
  "scripts": {
    "ng": "ng",
    "start": "ng serve --ssl --ssl-key .\\ssl\\server.key  --ssl-cert .\\ssl\\server.crt",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },

ssl
ssl\server.key
ssl\server.crt

Pour lancer mon application Angular, depuis Visual Studio Code la commande est maintenant :

>npm start

Mon application Angular et mon serveur IndentityServer4 derrière Https

Et voici le petit cadenas qui montre bien que mon application Angular se trouve maintenant derrière une adresse Https.

Voilà !

EntityFramework Core (EF Core) dans .NET - La meilleure documentation !

Tout le monde y va de son petit sample, de son exemple d'utilisation d'Entity Framework Core. Moi même j'ai pu décrire de temps en temps quelques commandes EF Core et puis je trouve la page ultime, celle qui remplace toutes les autres pages le site de la meilleure documentation sur Entity Framework Core.

La documentation qui est à la fois un tutorial intéressant à suivre même pour les plus expérimentés. Une documentation qui décrit l'intégralité de toutes les fonctions avec des exemples simples et bien construits à croire que cela ne peut pas être quelqu'un de Redmond car ils ne nous ont pas habitué à une telle documentation sur un produit.

Je pense que c'est l'effet OpenSource et ma fois, je suis bien content d'avoir trouvé ce site auquel je me réfère chaque fois que j'ai besoin d'approfondir mes connaissances de l'Entity Framework Core :

https://www.entityframeworktutorial.net/efcore/entity-framework-core.aspx
La meilleure documentation sur Entity Framework Core the Ultimate Documentation

C'est un exemple de documentation à suivre, il est fabuleux !

Have fun!

Authentification des Applications ASP.NET Core avec IdentityServer4 et Identity EF Core

Après un article complet sur le sujet de l'authentification des applications web. Je souhaite élargir mes connaissances à la découverte et à l'utilisation d'IdentityServer4.

Petite note personnelle, je suis très surpris de trouver ce code soruce :

\AngularAspNetCoreAuthen\Areas\Identity\Pages\Account\Register.cshtml.cs
namespace AngularAspNetAuthen.Areas.Identity.Pages.Account
{
    [AllowAnonymous]
    public class RegisterModel : PageModel
    {
        private readonly SignInManager<ApplicationUser> _signInManager;

\AspNetCoreMvcAuthen\Areas\Identity\Pages\Account\Register.cshtml.cs
namespace AspNetCoreMvcAuthen.Areas.Identity.Pages.Account
{
    [AllowAnonymous]
    public class RegisterModel : PageModel
    {
        private readonly SignInManager<IdentityUser> _signInManager;


C'est curieux on dirait bien que le model d'application ASP.NET Core Angular est plus évolué que celui d'MVC ... à méditer.

Bon, maintenant que je sais faire du Scaffolding sur L'Identity voici après étude des différentes solutions, le modèle de base que je vais utiliser :

https://github.com/damienbod/IdentityServer4AspNetCoreIdentityTemplate


https://github.com/damienbod/IdentityServer4AspNetCoreIdentityTemplate
IdentityServer4 AspNetCore IdentityTemplate

An ASP.NET Core IdentityServer4 Identity Template with Bootstrap 4 and Localization

Il y a de nombreux mélanges dans l'IdentityServer, on trouve certains nombre développeurs très doués qui se sont approprié le code source mais la communauté open source de base se trouve Ici :


Avec 273 contributors. 

Octobre 2020, On dirait qu'il y a un nouveau start pour IdentityServer4.

13 mai 2020 c'est très récent je trouve un article :

IdentityServer OpenID Connect (OIDC) OAuth 2.0 pour ASP.NET Core, IdentityServer pour implémenter le SSO (Single Sign-On) Attribution de Jeton aux applications.

C'est véritablement le point d'entrée de l'IdentityServer Moderne avec tout ce qu'il faut :

Welcome to IdentityServer4 (latest)

Single Sign-on / Sign-out
Single sign-on (and out) over multiple application types.

Pour terminer je vous laisse avec le côté commercial de l'open source et oui car il y a un côté commercial c'est ici :



Comment faire des Logs dans ASP.NET Core C#

Cela fait cent fois que l'on parle de log nous avons résolut le problème avec Log4Net pendant deux bonnes décennies mais c'est comme tout, les choses changent. Alors aujourd'hui ce qui est le mieux intégré à ASP.NET Core c'est Serilog.

Qu'à cela ne tienne, allons y rapidement, pour faire des Logs dans mon Projet ASP.NET Core avec Serilog le plus simplement du monde.

Il faut installer les packages suivants :

NuGet Packages  pour Serilog

C'est bon de la noter car maintenant chaque fois que j'instancie un nouveau projet, je me vois obligé de copier ces quelques lignes dans mon nouveau projet tellement c'est simple et efficace.

Dans mon fichier Startup.cs
J'écris le code de la fonction suivante :

private void ConfigureLoggerFactory( ILoggerFactory loggerFactory )
{
    string date = DateTime.Now.ToString();
    date = date.Replace( "/", "" );
    date = date.Replace( " ", "_" );
    date = date.Replace( ":", "-" );
    string logfileName = $"Log/log_{date}.txt";

    var serilog = new LoggerConfiguration()
        .MinimumLevel.Verbose()
        .Enrich.FromLogContext()
        .WriteTo.File( logfileName );


    loggerFactory.WithFilter( new FilterLoggerSettings
     {
         { "IdentityServer4", LogLevel.Debug },
         { "Microsoft", LogLevel.Warning },
         { "System", LogLevel.Warning },
     } ).AddSerilog( serilog.CreateLogger() );
}


Que j'appelle dans la fonction Configure de la façon suivante :

public void Configure( IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory )

ConfigureLoggerFactory( loggerFactory );

Voilà, l'intérêt de faire ainsi c'est que l'on récupère des logs en provenance des modules System, Microsoft, et IdentityServer4.

N'oubliez pas de consulter :

C#.NET - Serilog Log Not Working

Pour savoir comment configurer les Logs.

CQFD

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