[ASP.net / IIS][Résolu] Faire du SSO - Reconnaître l'utilisateur Windows

Bonjour,
J’ai un site intranet qui sert à faire de la gestion de projet avec une base Oracle derrière et pleins d’ASP.net. Le serveur qui héberge le tout est un serveur IIS. Aujourd’hui, lorsque les utilisateurs se connectent, ils doivent rentrer les identifiants / mode de passe, qui est le même que Windows.
La question est : peut-on récupérer directement le nom de l’utilisateur Windows pour le connecter sans qu’il ait besoin de s’identifier ? Le but, c’est que plus personne ne tape son mot de passe et ne se ré-identifie après être entré dans Windows. Comment vous y prendriez vous ? C’est faisable ?
Merci,
Teejhan

[quote=“Teejhan, post:1, topic: 32126”]Bonjour,
J’ai un site intranet qui sert à faire de la gestion de projet avec une base Oracle derrière et pleins d’ASP.net. Le serveur qui héberge le tout est un serveur IIS. Aujourd’hui, lorsque les utilisateurs se connectent, ils doivent rentrer les identifiants / mode de passe, qui est le même que Windows.
La question est : peut-on récupérer directement le nom de l’utilisateur Windows pour le connecter sans qu’il ait besoin de s’identifier ? Le but, c’est que plus personne ne tape son mot de passe et ne se ré-identifie après être entré dans Windows. Comment vous y prendriez vous ? C’est faisable ?
Merci,
Teejhan[/quote]

Ben euh… c’est le fonctionnement par défaut de Asp.net ca, sauf erreur d’incompréhension de ma part.

Il me semble que c’est un peu plus compliqué que ca.

IIS peut tres bien tourner avec le compte du client connecté (comme le souligne Bioshop) mais apres, récupéré l’authentification de ce client (pasword+mot de passe), pour se connecté à un serveur de BdD , c’etait (c’est ?) pas tres simple.
De mémoire , Sous IIS 5./ASP NET 1.1/ SQL Server, on ne pouvait le faire QUE si physiquement la base de données etait sur le meme serveur que IIS.

[quote=“ElRed, post:3, topic: 32126”]Il me semble que c’est un peu plus compliqué que ca.

IIS peut tres bien tourner avec le compte du client connecté (comme le souligne Bioshop) mais apres, récupéré l’authentification de ce client (pasword+mot de passe), pour se connecté à un serveur de BdD , c’etait (c’est ?) pas tres simple.
De mémoire , Sous IIS 5./ASP NET 1.1/ SQL Server, on ne pouvait le faire QUE si physiquement la base de données etait sur le meme serveur que IIS.[/quote]

Alors je dis pas que je suis pas a l’abri d’une incompréhension, mais je vois pas pourquoi il faut aller se connecter au serveur de base de donnée. Le serveur IIS est sur l’intranet. J’imagine donc que tous les utilisateurs se connectent à un domaine, duquel fait parti le serveur IIS.

[Edit] Ah, et euh ElRed, je suis pas un magasin de produits bio. Donc c’est “Bishop” merci B)

En activant l’authentification NT de IIS, et si le serveur est hébergé sur le même domaine et que les utilisateurs utilisent IE, alors normalement, ils n’ont pas besoin de se reloguer. Ensuite tu peux récupérer le login du mec connecté via HttpCOntext.Current.User.Identity.Name

Pour récupérer le mot de passe, je ne crois pas que ce soit faisable.

En espérent avoir bien compris ta question B)

Ce que j’ai compris du probleme de teejhan, c’est qu’il veux, qu’au niveau de la BdD Oracle, ce soit le compte du client qui soit reconnu et connecté.
Du coup, comme le d’écrit BodySplash, il faut sans doute faire une manip pour récupérer le mot de passe OU trouver une combine pour récupérer l’identification compléte et initialisé l’objet de connection SQL avec.

MP : Désolé Bishop B)

C’est heureusement impossible de recuperer le mot de passe sous quelque forme que ce soit. Maintenant faire de l’impersonation le temps d’une requete en forwardant le token de securite … peut etre… selon les scenarios. La plupart du temps, c’est une mauvaise idee et ca sera naturellement incomplet, encore une fois, expres.

[quote=“ElRed, post:6, topic: 32126”]Ce que j’ai compris du probleme de teejhan, c’est qu’il veux, qu’au niveau de la BdD Oracle, ce soit le compte du client qui soit reconnu et connecté.
Du coup, comme le d’écrit BodySplash, il faut sans doute faire une manip pour récupérer le mot de passe OU trouver une combine pour récupérer l’identification compléte et initialisé l’objet de connection SQL avec.
MP : Désolé Bishop B)[/quote]

Pas de soucis. En fait, le truc qui serait bien, c’est que teejhan se bouge un peu le cul pour nous dire plus précisement si ca marche pour lui ou si son probleme est différent B).

Ca me parait bien cradou de donner des droits à tous tes utilisateurs dans la base Oracle… parce qu’en gros, ca veut dire que n’importe qui pourra se connecter à ta base de données en utilisant un client du genre SqlPlus… C’est mal !

Ouaip si la question de base est effectivement d’utiliser le compte de l’utilisateur logué pour se connecter à Oracle, non seulement c’est mal, mais en plus je n’en vois pas l’intérêt.

J’ai beau relire, je vois pas ou vous avez vu qu’il veux utiliser sa base oracle. Il dit juste qu’il voudrais éviter que ses utilisateurs aient besoin de se réauthentifier.

Le problème, c’est justement qu’il y a un passage obligé vers la base Oracle pour une sombre histoire de profils utilisateurs stockés dans une table qui définit les droits aux différentes parties du site intranet. Par la suite, ils lancent des rapports qui sont en fait des requêtes Oracle mises en forme.

Par contre attention, si tous les utilisateurs de la base Oracle ont un équivalent Windows, l’inverse n’est pas vrai, je n’ai pas envie de donner des droits “à tout le monde”, mais que mes utilisateurs définit dans mon appli (donc des Users Oracle) puissent se connecter sans entrer de nouveau leur code utilisateur (+le mot de passe).

Concernant le mot de passe actuel, toutes mes confuses, en fait, le mot de passe a été initialisé “en masse”, donc pour l’instant, tout le monde a le même (oui, on déploie en ce moment).

Apparemment, il y a une possibilité via IIS qui est mise en avant par l’éditeur du logiciel, mais les méchants de la sécurité informatique n’en veulent pas (sous prétexte que non bon hein ça suffit maintenant si vous continuez on va lâcher les chiens et là on verra bien - Du coup j’insiste pas).

Apparemment, on peut se connecter à Oracle en validant juste que l’utilisateur Windows a un équivalent Oracle. Dans ce cas, ça marcherait bien si je pouvais récupérer ce User Windows facilement pour l’envoyer au moment où j’essaie de me connecter à la base.

C’est pas clair hein ? Oui je sais, pour moi aussi… B)

Oui bon bin j’avais pas le net de la journée aussi… B)

Pour l’instant, je ne vois en rien ce qui t’oblige à utiliser les comptes de tes utilisateurs pout te connecter à la base Oracle. Tout ce dont tu as besoin c’est leur identifiant et une connexion (qui peut etre partagée par tout le monde)

Euh, oui, on pourrait se limiter déjà à ça. Mais il me faudrait leur identifiant windows, au moins.
Par contre, quand tu parles de connexion, tu penses à une connexion à l’intranet ou à la base de données ?

Le problème est simple, j’ai des scripts de connexion qui existent déjà mais requiert un User / Mot de passe correspondant à ce qu’il y a dans la base de données. L’utilisateur s’identifie aujourd’hui via une page avec un formulaire, et je voudrais simplement pouvoir récupérer dans une variable le nom de l’utilisateur Windows pour le comparer avec les Users de la base. S’il y a un match, je connecte, sinon, je jette. C’est bien ou pas bien ? Pourquoi ?

Alors, je suppose que ton environnement contient :

  • Un domaine Windows (authentification centralisée avec Active Directory ou autre serveur LDAP)
  • Une base Oracle avec un couple identifiant / mot de passe valide pour te connecter dessus (on utilisera ce couple login / password pour tous les utilisateurs).

Ensuite sur ton serveur IIS, il faut désactiver l’authentification anonyme pour ton application WEB, et activer l’authentification Windows (avec IE tes utilisateurs seront automatiquement authentifiés, avec FireFox ils devront rentrer leur login / password du domaine avant de pouvoir acceder au site).

Dans ton fichier Web.config, tu regles aussi l’authentification sur “Windows”, et maintenant, magie, dans ton code-behind, tu récupères le compte utilisateur de ton client en faisant User.Identity.Username
(ou un truc dans le genre, j’ai pas VS sous la main).
Double avantage : tu te sers d’active directory pour authentifier tes utilisateurs, et si ils sont sous IE, ils sont reconnus automatiquement.
Maintenant, tu n’as plus qu’à aller voir dans ta base de données les droits de l’utilisateur (je suppose que tu dois avoir des tables du genre “Users”, “Roles”, et “UserRights”.
Au passage, avec ASP.Net 2, la gestion des rôles / profiles / droits est intégrée, tu n’as plus à faire tout ca à ta sauce ^^.

Magnifique. Bravo. Fabuleux. C’est exactement ce qu’il me fallait. Ni plus ni moins.

En un mot : Merci.

Un petit truc, si tu veux récupérer le compte utilisateur en dehors d’une page web, ca doit se trouver aussi dans System.Threading.Thread.CurrentThread.Identity.Username ou un truc dans le genre ^^.

Et pour avoir un “truc” plus stable que l’alias tu peux utiliser le SID dans WindowsIdentity.

Hoplà je remonte le topic. Désolay.

Bon, moi j’ai un problème similaire mais pas tout à fait. En fait j’aimerais pouvoir désactiver l’impersonation à un moment donnée de l’application afin d’effectuer une certaine tache (Export Excel/Word).

J’ai une 1e solution fonctionnelle qui consiste à utiliser un compte admin qui puisse effectuer les manips dont j’ai besoin pour l’export. Le login, password et nom du domaine seront définit dans le web.config. Mais bon, cay pas top et l’administrateur du client semble un vrai maniac de la sécurité sachant qu’il s’agira plus d’un Intranet.
Donc cette solution est à proscrire.

La 2e solution, consiste donc à neutraliser cette impersonation au moment de l’export (voir juste avant) puis de la réactiver une fois la tache finie. Cette solution me semble la meilleure pour l’instant, j’ai pas encore trouver d’autres scénarios. Meheu, je fais comment pour désactiver une impersonation qui a été mis à true dans le web.config ? et comment la réactiver juste après.

La 3e solution qui n’est autre que la 1e à quelques exception pres. En gros, au lieu d’utiliser une compte administrateur, j’utiliserais le compte “Localsystem” qui sera définit via IIS meheu, je ne connais pas le password de ce compte.

Bref, pour l’instant je cherche et si je n’ai vraiment pas de solution, je serais obligeais d’opter pour la 1e.

C’est pas ce que faisait le code juste au dessus ? (me rappelle plus, ca fait 4 mois !!!)