jeudi 16 juillet 2020

Comment effectuer une réinstallation propre d'IIS ?

Voilà un sujet que je souhaite automatiser sur le bout de doigts, mon IIS ne fonctionne plus. L'expérience que j'ai me fait penser que IIS s'est cassé ! Bien sûr pas tout seul mais je suis incapable de le réparer. Quand je fais browse Default Web Site

Comment tester l'installation correcte de IIS 

J'obtiens le message suivant "Ce site est inaccessible" :

Ce site est inaccessible
Ce site est inaccessible
D'autre part; la partie ASP.NET, sur un IIS qui fonctionne correctement "a disparu" !

Server IIS qui fonctionne
Donc je me lance dans la réinstallation d'IIS Grrrr !!!! Je trouve la page :

Microsoft - How to perform a clean reinstallation of IIS

Mais quand vous avez à faire à un Serveur Windows avec le "Server Manager", c'est une autre affaire alors allons-y ...

Comment supprimer correctement IIS sur un Serveur Windows 10


J'ai comme un petit peu l'impression de faire une connerie mais je n'ai pas le choix l'IIS de ce Windows Server ne fonctionne plus du tout !

Le plus important dans le page de Microsoft - How to perform a clean reinstallation of IIS c'est qu'il te donne le droit de supprimer le dossier suivant :

C:\Windows\System32\inetsrv

Car franchement, il faut oser trifouiller à la main dans le répertoire Windows\System32, mais là c'est Microsoft qui le dit, pour ma part je me retrouve après désinstallation de Web Services (IIS) avec un répertoire vide. Mais je vais le renommer tout de même.

Réinstaller IIS 

Je me retrouve à faire l'opération inverse : réinstaller IIS.


Comment Installer IIS sur Serveur Windows 10 Data Center

Je parcours le wizard d'installation des features de mon Windows Data Server :

Wizard d'installation d'IIS sur Windows 10 Server Data Center - 1

Il me détaille les éléments à installer ...

Wizard d'installation d'IIS sur Windows 10 Server Data Center - 2
Wizard d'installation d'IIS sur Windows 10 Server Data Center - 2
Je continue le parcours du wizard d'installation des features de mon Data Server ...

Wizard d'installation d'IIS sur Windows 10 Server Data Center - 3 Vide !
Wizard d'installation d'IIS sur Windows 10 Server Data Center - 3 Vide !
Mais là, heureusement que je suis concentré ... Je trouve qu'il manque des trucs, je suis une machine de Dev j'ai également la possibilité d'aller regarder un autre serveur qui lui fonctionne ...

Pas de doute, ici il manque des trucs ... Je coche donc les éléments suivants :


Wizard d'installation d'IIS sur Windows 10 Server Data Center - 3 Vide !
Voici les éléments à cocher à mon avis, pour avoir une chance qu'IIS fonctionne correctement.

Vérifier qu'IIS est correctement installé

Je vais dans le répertoire :

C:\Windows\System32\inetsrv

J'en profite pour mettre InetMgr.exe dans la barre des tâches. Je clique sur le Default Web Site  la partie ASP.NET est bien revenue. 

Je clique sur Browse *:80 (http)


Vérifier l'installation d'IIS

J'ai bien le site par défaut qui s'affiche dans mon navigateur :

Vérification d'IIS - Affichage du site par défaut sur Browse *:80 (http)

Maintenant que j'y pense, je crois que l'erreur est venue avec l'ouverture du fichier :

C:\Windows\System32\inetsrv\config\applicationHost.config

Et j'ai peut être effectuer une suppression "à la va vite" à moins qu'il ne soit resté ouvert dans un éditeur au moment d'une opération de management d'IIS. Auquel cas il y aurait pu avoir un problème de conflit.

Voilà, nous venons d'apprendre à réparer IIS sur une machine Windows 10 Server Data Center.

Reconnaissez que ce n'est pas aussi facile que dans la doc Microsoft !

Don't forget to go to the beach!

mercredi 15 juillet 2020

Internet Integration Services - IIS Management - Binding

Un jour j'ai travaillé sur une plateforme en ligne complexe, faite de plusieurs sites derrière le même serveur IIS, de serveurs de base de données, de moteurs d'indexation et depuis j'y reviens chaque fois que j'ai besoin de configurer ce fameux IIS (Internet Integration Services ) alors prenons quelques notes.

Avant tout la console de Management de IIS se trouve Ici :

%windir%\system32\inetsrv\InetMgr.exe

C'est à dire là :

C:\Windows\system32\inetsrv

Et donc là aussi, vous pouvez faire un raccourcis sur le bureau ainsi vous aurez votre IIS Management Console sous la mains.

Gestionnaire des Services Internet

J'accède à la console de management de IIS et je vais voir comment tout ceci est configuré.

Configuration d'une Plateforme complexe IIS
Configuration d'une Plateforme complexe IIS

Comment configuré tout ça ? C'est dans Modifier le site -> Liaisons ...


IIS Configuration du Sous-Domaine

On trouve cette commande également Ici :

IIS Site modifier les liaisons
Il est important de configurer le site dans le bon pool d'application.

IIS - Quelle application dans quel Pool d'application
IIS - Quelle application dans quel Pool d'application

Des informations importantes, Ici :

IIS - Management
IIS - Management

Voici l'ensemble des sites pour certes plateforme et les différents Bindings. Vous voyez c'est un peu complexe comme plateforme.

Ne pas oublier le fichier hosts pour diriger les sous-domaines vers la bonne adresse IP :

Le fichier host qui reprend les liaisons (binding) et redirige vers localhost

Voilà maintenant, j'ai compris comment je pouvais configurer les bindings sur ma machine de dev.

vendredi 10 juillet 2020

Serilog - Ne fonctionne pas avec IIS

Impossible de déployer un site qui utilise Serilog comme module de Logger derrière IIS car quand on déploie le site sur le serveur de production et bien il n'y a pas de Log ...

Je viens de me faire piéger et de lire environ 300 pages sur ce sujet et dans ces 300 pages il n'y a pas cette solution alors je vous la donne ! Il faut Restarter IIS

En effet, bien sûr il faut donner les droits d'écriture sur le répertoire de Log à l'utilisateur IIS_IUSR. Mais ce n'est pas tout. En développant avec ASP.NET Core et Kestrel en production, on créé un petit batch pour relancer Kestrel et les Logs de Serilog apparaissent tout naturellement mais avec IIS, on relance le site et il n'y a pas de Log ?! Pour avoir des Logs il faut "Redémarrer l'exécution du site" et dans IIS cela s'appelle cliquer sur le bouton Restart.

En production Serilog n'affiche pas de Log
Oui c'est une étourderie mais compte tenu de ce que je lis sur Internet, nous ne sommes les seuls à commettre cette bêtise et les solutions ne sont pas aussi claires.

Have fun!

jeudi 9 juillet 2020

ASP.NET Core Manage Authorize Policy

Ce sujet c'est comment gérer les autorisations au sein des applications ASP.NET Core ? Pour l'instant je connais deux mécanismes :

Dans le Startup.cs l'Authorise policy, exemple :

// Usage : [Authorize(Policy = "AdminPolicy")]
services.AddAuthorization( options => {
options.AddPolicy( "AdminPolicy",
builder => builder.RequireRole( Roles.Admin ) );
} );

Et dans le code, aller chercher une Claim de l'utilisateur mais c'est pas mal de code. Par exemple, mon Utilisateur possède un bool IsAdmin que je suis le seul à gérer (oui, j'ai fait comme ça) si je veux aller tester dans mon code ce bool pour savoir si j’octroie les droits ou non à l'utilisateur d'effectuer l'action.

Dans le contrôleur de l'action, voici le code :

    public class RoleController : Controller
    {
    private UserManager<ApplicationUser> userManager;

        public RoleController( UserManager<ApplicationUser> userManager )
        {
            this.userManager = userManager;
        }


[HttpPost]
        public async Task<IActionResult> Delete( string id )
        {
            var user = await userManager.GetUserAsync( User );
            if ( user.IsAdmin == false ) 
            {
                return RedirectToAction( nameof( HomeController.ErrorUserIsNotSuperAdmin ), "Home" );
            }

Mais bon, je ne vais pas écrire ce code pour tout les composants de mon application qui ont besoin de savoir de quel utilisateur il s'agit pour octroyer ou non les actions, ce serait fastidieux et rébarbatif.

Note de l'auteur (moi) : Au passage je réponds à une question souvent posé dans la StackOverflow :

stackoverflow - How to get current user in asp.net core

Curieux de voir à quel point cette communauté se perd elle même. Ils manquent de modérateurs à mon goût pour supprimer les mauvaises réponses car ils ne trouve pas de réponse correcte à des questions pourtant toutes simples. Peut être que c'est l'indexation de googoole qui le mets dans le vent...

Du coût je regarde la définition de RequireRole et juste à côté je remarque le définition de RequireAssertion alors ma chaine de recherche devient :

ASP.NET Core Authorize Policy Requires Assertion example

Et je tombe sur la bonne page :

MSDN - Policy-based authorization in ASP.NET Core

Et je tombe là dessus :

[Authorize(Roles = "Administrator")]

Grrrr ! Je conserve quand même mon AdminPolicy qui est plus facile à faire évoluer et qui est un bon exemple si je souhaite évoluer. Et finalement ce que je veux faire, peut se faire simplement par :

services.AddAuthorization(options =>
{
options.AddPolicy("IsSuperAdmin", policy => policy.RequireClaim( "role", "SuperAdmin"));
});

Et dans : StsIdentityServer\IdentityWithAdditionalClaimsProfileService.cs
public async Task GetProfileDataAsync( ProfileDataRequestContext context )
{
if ( user.IsAdmin )
{
claims.Add( new Claim( JwtClaimTypes.Role, "SuperAdmin" ) );
}

Le tour est joué, il ne me reste plus qu'à tester.

Identity Server - Configure Microsoft.Hosting.Lifetime to hear on prod

J'ai déployé mon application ASP.NET Core StsIdentity Server sur ma machine de PROD et lorsque j'exécute la partie serveur pour adresser la BD d'une part et le front, j'ai le message suivant :

[INF] Now listening on: http://localhost:xxxx<Microsoft.Hosting.Lifetime>

J'en déduis donc que pour que mon application fonctionne, il me faut modifier cette écoute sur une adresse qui diffère en PROD.

Donc la bonne question c'est : How to configure Microsoft.Hosting.Lifetime to hear on the right address in PROD ?

En posant la question de cette façon, je tombe sur ce site :

Andrew Lock | .NET Escapades - 5 ways to set the URLs for an ASP.NET Core app

Alors pour ma part, j'avais trouvé que en cliquant sur le StsIdentityServer.exe la partie serveur de mon application s'exécutait et j'obtiens les messages suivants

10:08:00.718 [INF] Now listening on: http://localhost:5000 <Microsoft.Hosting.Lifetime>
10:08:00.719 [INF] Now listening on: https://localhost:5001 <Microsoft.Hosting.Lifetime>

Alors, je me dis qu'en appelant mon exécutable avec le paramètre

--urls "http://localhost:5100;https://localhost:5101" 

Ca va marcher ! Et devinez quoi ? Ca Marche !

lundi 1 juin 2020

Outils pour développer avec la stack Angular

Vous connaissez Visual Studio Code mais je découvre d'autres outils comme TYPEDOC, quels sont les outils pour travailler et développer avec Angular ?

damienbod occupe pas mal de mes pensés en ce moment et je découvre ce projet :

software engineering - ASP.NET CORE, ANGULAR WITH WEBPACK AND VISUAL STUDIO

Un projet où il décrit tout un tas d'outils pour travailler avec cette stack, ASP.NET Core & Angular. Alors allons voir de plus prêt tous ces outils. Dans son post, il y a un lien vers ce projet du Github

https://github.com/preboot/angular-webpack

Ce que je pourrais un peu reprocher à ce genre de stack et à javascript c'est la prolifération des outils et la difficulté de savoir lequel utiliser. En plus cela donne un trop grande force au chef de projet qui passe par là  pour imposer un outil que vous ne connaissez pas et comment estimer le gain/temps passé qu'il va apporter.

Voici donc le premier outil de cette Stack TYPEDOC

Documentez votre projet avec TYPE DOC

Il faut toujours un outil pour documenter votre code. Typedoc fonctionne sous forme de balises de commentaire à ajouter dans votre code Anugular que du très classique mais il en faut bien un.

TYPE DOC
TYPE DOC
Cet outil lui même en invoque d'autres comme Grunt, Gulp, Webpack, bas ça fait une sacrée pile !

C'est quoi Webpack - bundle your images ?

Le problème avec tous ces outils, c'est de prendre la décision d'investir du temps et de la formation et d'estimer le gain que l'on aura en utilisant l'outil. Finalement l'utilisation de l'outil n'est t-elle pas une contrainte trop forte ?

webpack
Le schéma est assez explicite pour comprendre en le regardant ce schéma, vous avez d'un côté tout un tas de scripts java de css sous forme sass d'images aux formats jpg png et l'outil vous permet d'en faire des paquets.

Cet outil vous permet donc d’empaqueter votre application. J'irai plus loin une autre fois, perso je ne suis pas encore convaincu du rapport gain/temps.

C'est quoi Protractor end to end testing for Angular

Dans le développement moderne d'applications apprendre à faire des tests est essentiel là encore la difficulté est de choisir le bon framework, NUnit, UnitTest, XUnit, ils sont nombreux c'est toujours un peu le même principe mais là encore il faut investir en auto-formation. 

Les frameworks JS sont encore plus nombreux.

Framework de tests pour Angular
Voilà donc tout une stack, stack car l'ensemble de ces outils intervient à tous les niveaux du dev, pour bien travailler avec ASP.NET Core & Angular.

lundi 25 mai 2020

Migration angular 7 vers angular 8

A votre avis est-ce facile de migrer de Angular 7 vers Angular 8, je vais m'atteler à cette question pour découvrir toutes les subtilités d'Angular afin de migrer mon application en Angular 8, allant de l'avant vers la modernité.

Angular
Angular
Bien sûr tout le monde connait le guide de migration qui soit disant permet de migrer n'importe quelle application d'une version d'Angular vers un autre. Je vous présente, roulements de tambours le guide de migration de toutes les versions d'Angular vers toutes les autres ...


https://update.angular.io/
Guide de migration Angular

Encore qu'après quelques manipulation et un peu de lecture, on comprend que cela ne va pas être si facile.

Donc tout dépend de votre application actuelle en Angular 7. Est-elle au goût du jour, ou avez vous attendu trop longtemps. Le logiciel c'est évolutif en permanence, rester figé c'est mourir, n'attendez pas trop longtemps pour migrer.

#editeurlogiciel #agile

jeudi 21 mai 2020

Refused to frame because an ancestor violates the following Content Security Policy directive: "frame-ancestors 'self'".

Alors j'ai lu tellement de bêtises sur cette erreur et c'est normal car il faut la recontextualiser. Il s'agit de l'exécution d'une application cliente Angular qui essaye de connecter à un serveur StsIdentity et au moment d'initier la procédure de Login, votre Visual Studio Code vous crache cette erreur en rouge.

Refused to frame 'https://localhost:xxxxx/' because an ancestor violates the following Content Security Policy directive: "frame-ancestors 'self'".

La solution se trouve dans le fichier Startup.cs de votre exemplaire de l'IdentityServer, il faut ajouter les quelques lignes suivantes :

app.UseCsp( opts => opts
                .BlockAllMixedContent()
                .StyleSources( s => s.Self() )
                .StyleSources( s => s.UnsafeInline() )
                .FontSources( s => s.Self() )
                // BRY_20200519 .FrameAncestors( s => s.Self() )
                .FrameAncestors( s => s.CustomSources(
                        angularClientUrl, "https://localhost:4200"
                    )
                )
                .ImageSources( imageSrc => imageSrc.Self() )
                .ImageSources( imageSrc => imageSrc.CustomSources( "data:" ) )
                .ScriptSources( s => s.Self() )
                .ScriptSources( s => s.UnsafeInline() )
            );

Si cette solution vous a été utile, n'hésitez pas cliquer partout sur les sponsors, c'est comme cela que nous existons.
That's All Folks!

mardi 19 mai 2020

Migration ASP.NET Core 2.2 vers ASP.NET Core 3.1

Authentification avec les Applications ASP.NET Core 2.2 Impossible ... étonnant non ? Lors de la création d'un nouveau projet ASP.NET Core avec Visual Studio 2019 je constate que si je choisi le .NET Core 2.2 je ne peux pas faire d'authentification.

Je trouve ce quelque chose assez incroyable, si je choisie 2.2 je peux pas faire d'authentification.

Authentification avec ASP.NET Core 2.2 Impossible

Alors que si je choisie le ASP.NET Core 3.1 je peux :

Authentification avec ASP.NET Core 3.1
Bon du coup, voici le manuel de migration mais est possible de l'appliquer ?

Microsoft - Migrate from ASP.NET Core 2.2 to 3.0

Et à votre avis la Migration de ASP.NET Core 3.0 à ASP.NET Core 3.1 c'est diffcile ?

Microsoft - Migrate from ASP.NET Core 3.0 to 3.1

Aaaahhh non, de tous petits détails. Car vous avez remarqué que l'on ne peut pas créer des applications ASP.NET Core 3.0 ! :

Authentification avec ASP.NET Core 3.1
Ca parait bien sombre tout cela on dirait que les développement ayant opté pour ASP.NET Core 2.2 ne peuvent pas facilement passer à ASP.NET Core 3.1.

En tous cas, il faut le faire en deux étapes ...

A méditer !

mercredi 22 avril 2020

Can't access to localhost - localhost sent an invalid response.

Vous ne pouvez plus accéder à localhost ! J'ai lu tellement de mauvaises réponses avec des histoires de proxy, de configuration, des gens qui lancent même la commande : "netstat -a" pour savoir quels sont les ports ouverts sur leur machine.

J'ai encore ce problème aujourd'hui, alors je me sens un peu obligé de vous donner la réponse ici car c'est un problème du navigateur de Chrome en particulier de cookies précisément et aucunement de configuration de votre réseau.  Vous souriez mais on peut perdre un maximum de temps avec ces bêtises.

Can't access to localhost - localhost ne répond plus !
Can't access to localhost - localhost ne répond plus !

C'est moi qui ai installé une application web derrière localhost donc je sais pertinemment qu'elle devrait me réponse autre chose que "localhost sent invalid response". Je ne vous parle pas du lien  "Try running Windows Network Diagnostic" qui vous fait tomber tout au fond d'un trou noir !

Quand on est développeur, c'est tellement bête de perdre du temps avec ça ! Surtout que de développement d'application web est devenu encore plus tuchy avec l'avènement de Framework Front comme React, Vue ou Angular.

Je cherche à développer une application ASP.NET Core d'authentification des utilisateurs et quand mon processus d'authentification ne réussi pas, je ne peux plus relancer mon client Angular ! Grrr !

Oui, vous avez déjà deviné c'est un problème de cookies un truc parfaitement foireux comme aime bien nous les jeter en pâture Chrome.

Alors comme cela change tout le temps, aujourd'hui dans le Chrome d'aujourd'hui, comment je supprime les cookies liés à ma navigation pour accéder à nouveau à mon application web qui en développement est derrière l'adresse IP 127.0.0.1 ou localhost ?

C'est Ici :

Can't access to localhost - Supprimer les cookies du Navigateur
Can't access to localhost - Supprimer les cookies du Navigateur

Et puis on continue par ici, inutile de modifier les règles de proxy d'autant que cela pourrait être définitif pour votre machine placée dans le Cloud.


Can't access to localhost - Supprimer les cookies du Navigateur
Can't access to localhost - Supprimer les cookies du Navigateur

Et je continue par ici pour atteindre enfin ce que je cherche, supprimer les cookies.


Can't access to localhost - Supprimer les cookies du Navigateur
 
Je vois au passage que je peux supprimer trois type de données, l'historique de navigation, les cookies et les données de site, et les images et fichiers en cache.

Je suis en développement, je peux tout supprimer. Sur votre ordinateur personnel de maison, je ne vous conseille pas de le faire la même chose, vous devriez alors vous "reconnecter" à tous les sites que vous utilisez.

Voilà, c'est sûr que je ne vais pas faire cela à chaque fois que je rate ma connexion à localhost, il va falloir que mon code le fasse correctement, le plus rapidement possible.

J'ai pris une petite note pour le futur, je vous fiche mon billet que tout aura changé dans quelques mois, à savoir même si on aura encore le droit de supprimer nos "données de navigation".

Pour être complet je dois ajouter quelque chose : ATTENTION TIME RANGE

Je viens de commettre un erreur, j'ai planté le processus d'authentification de mon utilisateur et puis je suis parti déjeuner. Quand je reprends, impossible : localhost sent invalid response ! Même en supprimant les données de navigation.

Attention cela faisait plus d'une heure que j'étais parti du coup il en faut pas oublier le Time Range :
localhost sent invalid response - Time Range peut jouer des tours

Voilà cette fois j'espère que je n'aurais plus jamais à y revenir.

Have fun! (Ah non merde y'a confinement Grrr)

vendredi 3 avril 2020

ASP.NET DB for ASP.NET Core Indentity

Pour gérer ma communauté d'utilisateurs, c'est  à dire gérer les données des utilisateurs qui vont venir s'identifier au sein de mon application Web ASP.NET Core, j'ai besoin de mieux connaitre l'Identity Data Management.

Le Scaffolding et les Projects Template m'ont déjà appris un tas de choses mais maintenant je souhaite aller plus loin. Afin d'avoir un vrai système de gestion des utilisateurs.

Structure de la Base de Données AspNet

Voici les tables qui sont créés par défaut :


AspNetDB - Tables créés par défaut
AspNetDB - Tables créés par défaut
Dans la table AspNetUsers à quoi sert le champ LockoutEnable ?

Docs  .NET API Browser  Microsoft.AspNetCore.Identity  IdentityUser

C'est tout un bordel cela ne vous est jamais arrivé de devoir vous connecter sur site Microsoft un peu tuchy si vous ratez votre connexion le site vous répondez que vous ne pouvez plus vous connecter et qu'il faudra recommencer dans 30 minutes et si vous ratez encore il vous faudra attendre une heure et bien c'est la gestion de tout cela.

En fait cela sert à protéger votre site des robots ou de certains qui voudrait attaquer votre site par déni de service.

User IsEnable False

Si je souhaite pouvoir disabler mon utilisateur, c'est arrivé parois. Un utilisateur que ne veut plus payer son abonnement mais qui continue d'utiliser la plateforme.

Et bien c'est assez différent du MemberShip Provider où tout ceci était déjà prévu. Avec ASP.NET Core vous pouvez l'ajouter "à la main" dans

public class ApplicationUser : IdentityUser
{

    public bool? IsEnabled { get; set; } 

Dans : \Areas\Identity\Pages\Account\Register.cshtml.cs

var user = new ApplicationUser
{
    ...
    IsEnabled = true
};


Et dans \Areas\Identity\Pages\Account\Login.cshtml.cs

public async Task<IActionResult> OnPostAsync( string returnUrl = null )
{
    returnUrl = returnUrl ?? Url.Content( "~/" );

    if ( ModelState.IsValid )
    {
         // Manage User IsEnable
         var user = _userManager.FindByEmailAsync( Input.Email ).Result;
     if ( user.IsEnabled.HasValue && user.IsEnabled == false )
     {
           _logger.LogWarning( "User account has been disabled by admin." );
          return RedirectToPage( "./Lockout" );
     }


Si l'utilisateur est Disablé, il sera redirigé vers la page Lockout le message ne sera pas très explicite pour lui mais il faudrait scaffolder la page Lockout pour délivrer un message plus explicite ... si vous avez le temps ...

Mais du coup, si je disable mon utilisateur, il ne pourra plus venir dans la plateforme et donc ne pourra plus supprimer ses données personnelles ce qui est quelque peu en désaccord avec les nouvelles dispositions sur la gestion des données personnelles.

Et je pense que c'est la raison pour laquelle ce mécanisme qui était intégré ne l'est plus.

To Be Continued!

lundi 30 mars 2020

ASP.NET Core & EF & IdentityServer & Angular

Voici la stack que je souhaite intégrer dans mon projet. L'important c'est d'aller directement au but nous avons sur ces sujets pléthore de documentation alors comment trouver les bonnes pages pour implémenter directement la solution.

Voici certainement la page la plus importante, ici on vous parle directement d'IdentityServer :

MSDN - ASP.NET Core -  Authentification et autorisation pour SPAs

Et je vous donne également les deux pages de la documentation d'IdentityServer :

IdentityServer4 - Using EntityFramework Core for configuration and operational data

Il faut exécuter le l'IdentityServer avant le client MvcClient, une petite astuce dont je viens de me rappeler : Bouton Droit sur la Solution -> Properties et là on utilise les possibilités de Multiple startup projects pour lancer tous ces projets d'un seul clique.


Visual Studio with IdentitytServer - Start multiples projects
Visual Studio with IdentitytServer - Start multiples projects

IdentityServer4 - Using ASP.NET Core Identity

Je vous rappelle que notre objectif est d'ajouter à tout ça un peu de données utilisateur, comme son adresse, son âge (avec son consentement bien sûr). Aussi je pense qu'il est utile de regarder par ici :

Deblokt - 05. IdentityServer4 Adding custom properties to User .NET Core 3.1

Et là nous avons tout ce qu'il faut pour faire une bonne intégration des Technologies ASP.NET Core & EntityFramework & IndentityServer avec Identity (de base) & une application cliente Angular.

Configuration du Template ASP.NET Core EF Angular

A partir de la base de données Identity qui nous est donnée dans le Template que faut-il pour aller authentifier une application Angular.


ASPNETDB - Core Identity DataBase

Il faut obtenir la structure suivante pour travailler avec IdentityServer4 :

ASPNETDB - Core IdentityServer DataBase

CQFD !







mardi 24 mars 2020

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

Sur quoi doit-on baser l'authentification d'une application web ASP.NET Core ? Quelle structure pour la base de données AspNet ? C'est un vieux sujet, remis au gout du jour par le développement des nouvelles applications ASP.NET Core. Ce sujet est vieux comme les applications web mais nous devons adapter les anciennes structures aux nouvelles possibilités de connexions.

Quand j'instancie une Application Templates ASP.NET Core Authentification :

ASP.NET Core MVC Authentification by Individual User Accounts
ASP.NET Core MVC Authentification by Individual User Accounts 

Qu'est ce que j'ai en définitive ?


ASP.NET Core MVC Authentification by Individual User Accounts
ASP.NET Core MVC Authentification by Individual User Accounts 
Je trouve curieux, j'exécute l'application, je cherche à me m'enregistrer on me dit Register mais je ne trouve pas cette page, ni cette vue :


ASP.NET Core Individual Authenification
ASP.NET Core Individual Authenification
Après je m'attèle à un peu de lecture ici :

INFINITES BLOGS - Implémenter IdentityServer 4 dans une application ASP.NET Core 2.2

Et de mon côté, je vous donne la structure de la BD que j'ai trouvé sur un exemple probant d'implémentation d'IdentityServer :

https://github.com/Deblokt/IdentityServer4Demos.NETCore31


Structure de la Base de Données pour une Application IdentityServer

Manifestement ce projet est issu de IdentityServer

IdentityServer - The Identity and Access Control solution that works for you

Plutôt complet, non ? Trop peut être comment faire que choisir quelle structure pour ce que je veux faire ...

Je poursuis la découverte de mon exemple Template de base car j'aime bien connaitre déjà ce que l'on nous propose comme standard.

Je déroule le processus d'enregistrement car je sais que c'est à ce moment que la Base de Données d'Indentification est créée et cette BD n'est pas encore créée sur ma machine de développement.

Apply Migrations

L'application me propose un bouton Apply Migrations qui avec un peu de code, va tout faire ...


Migration Applied
Migration Applied
Et ensuite, je suis Welcome dans l'application avec la possibilité de confirmer mon compte.

Confirmer mon enregistrement
Je prends note de tout ça car c'est drôlement bien fait ! Presque fascinant pour une dev comme moi qui est vécu les premières version d'ASP.NET et quand je pense au boulot et au code qu'il fallait mettre en œuvre à l'époque.

Alors que là, tout est à portée de clique.


Welcome Home sweet home
Welcome Home sweet home

Voilà la structure de la base qui a été créée :

ASP.NET Core Identity
Et nous n'avons pas encore intégré IndentityServer dans ce projet. Pour poursuivre je propose de regarder du côté du Scaffolding mais qu'est ce que c'est que ça ?

Et bien avec mon Visual Studio je fais bouton droit au niveau du projet :

Projet->bouton droit->Add->New Scaffolded Item ...


Projet->bouton droit->Add->New Scaffolded Item ...
Projet->bouton droit->Add->New Scaffolded Item ...
New Scaffolded Item -> Identity


New Scaffolded Item -> Identity
New Scaffolded Item -> Identity
Et là, un monde s'ouvre à vous ...


Scaffolded Identity
Scaffolded Identity
Je choisi simplement Account\Register alors que je pensais que j'étais déjà passé par cette page car je me suis enregistré donc où était le formulaire d'enregistrement dans l'application... Je trouve cela pour le moins Curieux.


Data context class
Data context class
Je fais les choix suivants pour le Data Context et la User Class

Ajouter une légende
Avec tout ça, qu'est ce j'ai ... Avant toute cette opération j'ai eu le bon goût de sauvegarder une version de référence pour voir ce que Visual Studio Template à créé dans ma nouvelle application. C'est une méthode que vous pouvez employer lorsque vous travaillez avec Visual Studio Template de garde une référence.

C'est très enrichissant de pouvoir constater, observer ce que Visual a créé pour nous. Je vous le livre tel quel mais sachez que c'est une bonne façon de travailler. Il faut bien connaitre le Template c'est une façon de se faire une culture des références pour aller regarder ce que les autres ont fait.


Item Sacffolded -> Account\Register
Item Sacffolded -> Account\Register
Alors me direz-vous, que vient faire IdentityServer là dedans et bien ce sera le sujet du prochain post ... Identity vs IndentityServer.

Un peu de lecture sur ce sujet :

StackOverflow - .NET Core IndentityServer4 vs Indentity Authentification
Alors qu'en fait la question n'est pas de les comparer car Identity c'est tout simplement une table de Users alors qu'IdentityServer est un système bien plus large permettant l'authentification et l'autorisation de multiples applications accédant à de multiple APIs.

MSDN - Authentication and authorization for SPAs
Authentication and authorization for SPAs (Single Page Application) ASP.NET Core Identity for authenticating and storing users is combined with IdentityServer for implementing Open ID Connect.

Ici les deux sont combinés.

To Be Co