Bonjour,
Je suis en train de porter une application WebForms en AngularJS.
J'ai opté pour Angular6.
Contexte :
Je me suis basé sur cet article pour créer mon projet Angular dans Visual Studio :
http://www.talkingdotnet.com/how-to-...l-studio-2017/
J'ai dans un premier temps suivi le tutorial d'Angular afin de me familiariser un petit peut avec le fonctionnement d'Angular :
https://angular.io/tutorial
Et j'ai adapté avec plus ou moins de succès le code du projet exemple de Microsoft pour interfacer Angular2 avec SQL Server (malheureusement l'exemple n'est pas à jour et j'ai pas mal galéré pour obtenir quelque chose de fonctionne) :
https://github.com/Microsoft/sql-ser...tour-of-heroes
Au final, j'ai quelque chose qui fonctionne pas trop mal.
J'ai même réussi à le faire tourner sous Linux avec un SQL Server hébergé dessus. Le truc inespéré.
Maintenant, il est temps de transposer mon projet WebForms à cette nouvelle techno qui est très nouvelle pour moi.
Et là ça se corse.
Avant toute chose, je dois gérer la connexion à l'application et à la base de données.
Mon application utilise des login SQL Server pour fonctionner.
Ainsi, lorsque l'utilisateur saisit sont login/pass, c'est celui de SQL Server directement.
Ceci a pour principal avantage de blinder au maximum la sécurité, puisque l'utilisateur ne peut en aucun cas accéder à des données ou faire des opérations pour lesquelles sont login n'est pas expressément autorisé au niveau de la base de données.
Cependant, dans l'exemple de Microsoft, on utilise une notion de "transcient" pour n'avoir à gérer la connexion à la base qu'au startup.
Ceci ne me convient pas, puisque chaque appel à un contrôleur doit se faire avec le login de l'utilisateur connecté : donc pas de connexion partagée entre tout le monde.
Aussi, je dois me débrouiller pour conserver d'une manière ou d'une autre une info pesistante pour ne pas avoir à me trimbaler le user/pass de la base de données à chaque appel à mon contrôleur : une fois l'utilisateur connecté, il faut que je puisse conserver cette info au niveau de la base de données.
Jusqu'à présent, j'utilisais une variable de session "de contexte" (qui contenait tout ce dont j'avais besoin pendant toute la durée de la visite de l'utilisateur).
Mais là avec Angular j'ai pas le choix : tout se passe côté client.
Est-ce possible de gérer des sessions côté contrôleur ?
Comment ça marche ?
J'avoue que :
1/ L'appel des contrôleurs depuis Angular me laisse un peu perplexe (notamment le fait de ne pas appeler explicitement une méthode et se limiter aux verbes HTTP me déroute complètement)
2/ Je ne trouve aucune littérature/tuto permettant d'expliquer le fonctionnement d'un contrôleur .NET à partir d'Angular et notamment comment gérer des informations persistantes côté serveur
Voici notamment un extrait de mon "Startup.cs" :
En commentaire, les éléments du tuto de Microsoft. J'ai remplacé les objets QueryPipe et Command par la chaîne de connexion brute.
Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { string ConnString = Configuration["ConnectionStrings:Plannix"]; /* services.AddTransient<IQueryPipe>(_ => new QueryPipe(new SqlConnection(ConnString))); services.AddTransient<ICommand>(_ => new Command(new SqlConnection(ConnString))); */ services.AddTransient<string>(_ => ConnString); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); }
Que veut dire "transcient" : c'est partagé pour la session de l'utilisateur ? Pour tous les utilisateurs ? C'est simplement exécuté à chaque appel mais des paramètres implicites aux contrôleurs ?
A quoi sert le "AddMvc" ? J'en ai vraiment besoin ? (sâchant que 100% des mes contrôleurs ne feront que des appels à des procédures stockées et renverrons le résultat JSON produit par SQL Server, sans aucune autre intelligence).
Et voici le constructeur de mon contrôleur des "héros" modifié :
Avant :
Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 public HeroesController(string cnxString) { this.SqlCommand = new Command(new SqlConnection(cnxString)); this.SqlPipe = new QueryPipe(new SqlConnection(cnxString)); }
Après :
Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 this.SqlCommand = new Command(new SqlConnection(cnxString)); this.SqlPipe = new QueryPipe(new SqlConnection(cnxString));
Le but du jeu étant maintenant de trouver comment régupérer un "login/pass" persitant d'un appel à l'autre, mais dans le périmètre de l'utilisateur connecté seulement...
Partager