Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Autres langages pour le Web
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/05/2005, 15h44   #1
Membre régulier
 
Avatar de didier.cabale
 
Homme Didier Cabalé
Conseil - Consultant en systèmes d'information
Inscription : août 2004
Messages : 102
Détails du profil
Informations personnelles :
Nom : Homme Didier Cabalé
Âge : 49
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Conseil

Informations forums :
Inscription : août 2004
Messages : 102
Points : 93
Points : 93
Par défaut [CGI] durée de validité de HTTP_AUTHORIZATION

[CGI]
Bonjour,
J'ai un prog CGI qui ouvre sur le navigateur client une fenetre d'authentification basique. Une fois que le client s'est logué avec succès à partir de cette fenêtre, la fenêtre d'authentification basique ne s'ouvre plus (tant que le navigateur reste ouvert), s'il redemande l'accès à cette page. Je suppose que c'est parce-que les paramètres d'authentification ont dû être sauvés en cache chez le client.
Ma question est: comment maîtriser la durée de vie de la variable HTTP_AUTHORIZATION, de façon à forcer le client à re-saisir ses paramètres d'authentification basique à chaque entrée sur la page?
Nb: l'en-tete HTTP 'Cache-Control: No-cache' ne semble pas fonctionner
Merci
didier.cabale est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2005, 22h01   #2
Membre émérite
 
Avatar de Celelibi
 
Inscription : janvier 2004
Messages : 990
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 990
Points : 822
Points : 822
La durée de vie de l'authentification http est... nulle.
Comment ça se passe lorsque le navigateur tombe sur une page protéger par une telle identification ?

1) Le navigateur effectue une requête http standard
2) Le serveur revoi l'entête WWW-Authenticate: Basic realm="truc machin" et le statut 401 (ainsi qu'une page d'erreur).
3) Le navigateur remande à l'utilisateur l'entrer un couple login/password, puis réitère la requête http avec en plus l'entête Authorization: Basic login:pass (login:pass étant encodé en base64)
4) Si le login/mdp sont bons, le serveur renvoi un statut 200 et la page demandé, sinon, re WWW-Authenticate et re 401.

Tu remarquera qu'il n'a été évoqué à aucun moment la conservation des informations. Et c'est normal : pour chaque page le navigateur renvoi le couple login/mdp, ce qui garanti une meilleur sécurité.

Je pense que si tu veux provoquer la réidentification il doit suffit de renvoyer l'en-tête WWW-Authenticate. Mais fais attention à ne pas l'envoyer à chaque fois qu'on demande ta page. :p
__________________
Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.
Celelibi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2005, 09h06   #3
Membre régulier
 
Avatar de didier.cabale
 
Homme Didier Cabalé
Conseil - Consultant en systèmes d'information
Inscription : août 2004
Messages : 102
Détails du profil
Informations personnelles :
Nom : Homme Didier Cabalé
Âge : 49
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Conseil

Informations forums :
Inscription : août 2004
Messages : 102
Points : 93
Points : 93
Citation:
Tu remarquera qu'il n'a été évoqué à aucun moment la conservation des informations. Et c'est normal : pour chaque page le navigateur renvoi le couple login/mdp, ce qui garanti une meilleur sécurité.
Dans mon CGI, l'envoi de l'entete WWW-Authenticate est conditionné par un booléen qui se résume à "if GetEnvironmentVariable('HTTP_AUTHORIZATION', Buff, SizeOf(Buff)) = 0 then result := false;". Donc si le result = false -> envoi de l'entete WWW-Authenticate.
Or sur la 1ère requête utilisateur, GetEnvironmentVariable('HTTP_AUTHORIZATION', Buff, SizeOf(Buff)) = 0, ce qui provoque l'envoi de l'entete WWW-Authenticate -> Ok. Mais sur les requêtes suivantes, je suppose que GetEnvironmentVariable('HTTP_AUTHORIZATION', Buff, SizeOf(Buff)) > 0, ce qui ne m'envoie plus l'entete WWW-Authenticate.
Donc je suppose que la variable d'environnement 'HTTP_AUTHORIZATION' a bien une durée de vie.
Me comprends-tu mieux?
Didier
didier.cabale est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2005, 19h55   #4
Membre émérite
 
Avatar de Celelibi
 
Inscription : janvier 2004
Messages : 990
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 990
Points : 822
Points : 822
Oui je comprends bien, mais si lors des requêtes suivantes ta variable 'HTTP_AUTHORIZATION' est définie, c'est parceque le navigateur à renvoyé automatiquement le couple login/mdp sans que le serveur ait eut à le demander.
La variable 'HTTP_AUTHORIZATION' n'a aucune durée de vie : ceci serait une faille potentielle dans le système d'identfication http (qui jusqu'à présent n'a révélé aucune faille).

Si tu veux vraiment forcer l'utilisateur à renvoyer son login/mdp, il faut forcer le serveur à renvoyer l'entête WWW-Authenticate, ou alors l'envoyer "manuellement".
__________________
Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.
Celelibi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2005, 12h51   #5
Membre régulier
 
Avatar de didier.cabale
 
Homme Didier Cabalé
Conseil - Consultant en systèmes d'information
Inscription : août 2004
Messages : 102
Détails du profil
Informations personnelles :
Nom : Homme Didier Cabalé
Âge : 49
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Conseil

Informations forums :
Inscription : août 2004
Messages : 102
Points : 93
Points : 93
Citation:
Oui je comprends bien, mais si lors des requêtes suivantes ta variable 'HTTP_AUTHORIZATION' est définie, c'est parceque le navigateur à renvoyé automatiquement le couple login/mdp sans que le serveur ait eut à le demander.
Donc la variable 'HTTP_AUTHORIZATION' (ou le couple login/mdp) a bien une durée de vie sur le navigateur, puisque le navigateur renvoie automatiquement le couple login/mdp, lors des prochaines authentification. Non?
Didier
didier.cabale est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2005, 18h11   #6
Membre régulier
 
Avatar de didier.cabale
 
Homme Didier Cabalé
Conseil - Consultant en systèmes d'information
Inscription : août 2004
Messages : 102
Détails du profil
Informations personnelles :
Nom : Homme Didier Cabalé
Âge : 49
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Conseil

Informations forums :
Inscription : août 2004
Messages : 102
Points : 93
Points : 93
En fait, je pense que mon besoin est impossible à résoudre simplement -> cf http://www.caucho.com/support/resin-interest/0306/0120.html

Merci pour votre aide
didier.cabale est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2005, 00h30   #7
Membre émérite
 
Avatar de Celelibi
 
Inscription : janvier 2004
Messages : 990
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 990
Points : 822
Points : 822
si tu renvoi l'entête WWW-Authenticate le navigateur sera obligé de redemander l'identification.
__________________
Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.
Celelibi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2005, 09h56   #8
Membre régulier
 
Avatar de didier.cabale
 
Homme Didier Cabalé
Conseil - Consultant en systèmes d'information
Inscription : août 2004
Messages : 102
Détails du profil
Informations personnelles :
Nom : Homme Didier Cabalé
Âge : 49
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Conseil

Informations forums :
Inscription : août 2004
Messages : 102
Points : 93
Points : 93
Citation:
si tu renvoi l'entête WWW-Authenticate le navigateur sera obligé de redemander l'identification.
Le pb est que, dans mon cgi, le renvoi de www-authenticate est conditionné par une fonction booléenne qui renvoie toujours 'true' dès que le navigateur client a réussi à s'authentifier. (cf mon 2ème message)
Me suivez-vous?
didier.cabale est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2005, 18h03   #9
Membre émérite
 
Avatar de Celelibi
 
Inscription : janvier 2004
Messages : 990
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 990
Points : 822
Points : 822
Ne pourrais-tu pas renvoyer quand même cette en-tête ? peut-être des données ont-elles déjà été envoyés au navigateur, ce qui empêcherais de renvoyer une quelconque en-tête.

quelque chose du genre :
Code :
1
2
3
4
inclusion du fichier qui gère l'entête WWW-Authenticate
si [conditions] alors renvoyer quand même l'entête WWW-Authenticate
...
suite de la CGI
Dis moi, en quel langage est ta CGI ?
SI tu n'a aucun moyen de renvoyer manuellement une en-tête dans le corps de ta CGI, alors ton problème n'a pas de solution. À part peut-être modifier ta fonction booleenne qui conditionne l'envoi de l'en-tête WWW-Authenticate.
__________________
Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.
Celelibi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2005, 10h10   #10
Membre régulier
 
Avatar de didier.cabale
 
Homme Didier Cabalé
Conseil - Consultant en systèmes d'information
Inscription : août 2004
Messages : 102
Détails du profil
Informations personnelles :
Nom : Homme Didier Cabalé
Âge : 49
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Conseil

Informations forums :
Inscription : août 2004
Messages : 102
Points : 93
Points : 93
Citation:
Dis moi, en quel langage est ta CGI ?
Delphi
Citation:
SI tu n'a aucun moyen de renvoyer manuellement une en-tête dans le corps de ta CGI, alors ton problème n'a pas de solution
Mais je peux renvoyer manuellement l'en-tête.
Pour plus de clarté, voici le source de mon CGI:

** début procedure principale **
procedure Main
begin
if (not Authorized) then begin

WriteLn('HTTP/1.1 401 Unauthorized');
WriteLn('Content-type: text/html');
WriteLn('WWW-Authenticate: Basic realm="BCRx"');
WriteLn;
Writeln('<html><head><title>401 Unauthorized</title></head><body>');
WriteLn('<h1>You need a password to access this page !</h1>');

end else begin

WriteLn('HTTP/1.1 200 Welcome !');
WriteLn('Expires: Thu, 01 Dec 1994 16:00:00 GMT');
WriteLn('Content-type: text/html');
Writeln;
WriteLn(s);

end;

WriteLn('</body></html>');
end.
** fin procedure principale **

** début function Authorized **
function Authorized: boolean;
var
auth, client_IP: string; // HTTP_AUTHORIZATION
user_id: string; // username
pwd : string; // password
buff: Array[0..50] of char;
size: byte;
begin
// default reply
Result:=false;

// *** tout se joue sur cette fonction ***
if (GetEnvironmentVariable('HTTP_AUTHORIZATION', buff, SizeOf(buff)) = 0) then exit;
auth := buff;
auth := copy(auth,pos(' ',auth)+1,length(auth));
// Decode
auth := Base64toStr(auth);
user_id := copy(auth, 1, pos(':',auth)-1);
if user_id = '' then exit;
pwd := copy(auth, length(user_id)+2, length(auth));

Result:=true;
end;
** fin function Authorized **

Mon pb est que, après une authentification basique client réussie via le formulaire d'authentification basique, GetEnvironmentVariable('HTTP_AUTHORIZATION', buff, SizeOf(buff)) sera toujours > 0, et il n'y aura plus moyen de réinitialiser cette fonction à 0. De ce fait la fonction Authorized retournera toujours 'true', et www-authenticate ne sera jamais renvoyé au navigateur. Le seul moyen, d'après moi, de reprovoquer le renvoi du formulaire d'authentification basique est de fermer le navigateur, de le réouvrir, et de rappeler l'URL.

Est-ce plus clair?
didier.cabale est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2005, 19h17   #11
Membre émérite
 
Avatar de Celelibi
 
Inscription : janvier 2004
Messages : 990
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 990
Points : 822
Points : 822
Je précise que je ne connais pas du tout le delphi, mais le but est que tu comprenne comment faire :
Code :
1
2
3
4
5
6
7
8
** début procedure principale **
procedure Main
begin
if ((not Authorized) and (not TimeUp)) then begin

WriteLn('HTTP/1.1 401 Unauthorized');
...
...
Ensuite tu défini ta fonction TimeUp pour qu'elle renvoi "true" si le temps depuis la dernière identification de cette IP est dépassé, sinon "false".

Si tu veux vraiment obliger l'utilisateur à ressaisir ses mdp à chaque page c'est un peu plus difficile car en fait le navigateur renvoyant les login/mdp au serveur à chaque requête, il faudrai lui dire "non" une fois sur 2.
Ceci est faisable par un jeu de cookies.


Ceci dit je ne vois pas bien l'utilité d'obliger le visiteur à se réidentifier à chaque fois. Mais en même temps je n'ai pas tous les détails du contexte.
__________________
Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.
Celelibi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2005, 17h12   #12
Membre régulier
 
Avatar de didier.cabale
 
Homme Didier Cabalé
Conseil - Consultant en systèmes d'information
Inscription : août 2004
Messages : 102
Détails du profil
Informations personnelles :
Nom : Homme Didier Cabalé
Âge : 49
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Conseil

Informations forums :
Inscription : août 2004
Messages : 102
Points : 93
Points : 93
Citation:
Ensuite tu défini ta fonction TimeUp pour qu'elle renvoi "true" si le temps depuis la dernière identification de cette IP est dépassé, sinon "false".
mais je ne veux pas conditionner l'identification à un time-out.

Citation:
Si tu veux vraiment obliger l'utilisateur à ressaisir ses mdp à chaque page c'est un peu plus difficile car en fait le navigateur renvoyant les login/mdp au serveur à chaque requête, il faudrai lui dire "non" une fois sur 2.
Ceci est faisable par un jeu de cookies.
je ne veux pas utiliser de cookie non plus .. :)

Citation:
Ceci dit je ne vois pas bien l'utilité d'obliger le visiteur à se réidentifier à chaque fois. Mais en même temps je n'ai pas tous les détails du contexte.
Ce que je recherche en fait, c'est proposer à l'internaute un logout, suite à un login réussi. Autrement dit: le login réussi renvoie sur une page de bienvenue ou il existe un lien [logout], qui renvoie à la même page mais avec, dans mon CGI, une fonction 'Authorized = false' (pour obliger l'identification).
Suis-je plus clair?
didier.cabale est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2005, 20h18   #13
Membre émérite
 
Avatar de Celelibi
 
Inscription : janvier 2004
Messages : 990
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 990
Points : 822
Points : 822
Oui c'est assez claire.
Mais dans ce cas là, pourquoi avoir une fonction de logout puisqu'il n'y a pas réelement de login ?

En effet ce concepte de login/logout n'est applicable que si il y a une session (ou quelque chose qui y ressemble) sur le serveur. Or, dans le cas d'une identification par HTTP il n'existe aucune session au niveau serveur.

Lors d'un login, le client envoi le mdp au serveur, celui-ci enregistre que telle ip s'est bien connecté et ne redemandera plus de mdp durant un certain temps.
Dans de cas d'une identification HTTP, le client va envoyer son mdp au serveur, s'il est bon le serveur renvoi la page demandé. Puis pour la page suivant le navigateur renvoi encore le mdp. Il n'y a aucune donnée stoqué sur le serveur et donc pas de session.
Sans sessions on ne peut pas parler de login/logout.


Ton problème est sans solution car justement, ce problème ne peut être posé.
__________________
Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.
Celelibi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2005, 12h19   #14
Membre régulier
 
Avatar de didier.cabale
 
Homme Didier Cabalé
Conseil - Consultant en systèmes d'information
Inscription : août 2004
Messages : 102
Détails du profil
Informations personnelles :
Nom : Homme Didier Cabalé
Âge : 49
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Conseil

Informations forums :
Inscription : août 2004
Messages : 102
Points : 93
Points : 93
Citation:
Mais dans ce cas là, pourquoi avoir une fonction de logout puisqu'il n'y a pas réelement de login ?
J'assimile l'authentification basique à un login.

Citation:
Dans de cas d'une identification HTTP, le client va envoyer son mdp au serveur, s'il est bon le serveur renvoi la page demandé. Puis pour la page suivant le navigateur renvoi encore le mdp. Il n'y a aucune donnée stoqué sur le serveur et donc pas de session.
Le pb est en effet que la persistance du login/mdp est géré par le navigateur, et pas par le serveur .. ->
didier.cabale est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h13.


 
 
 
 
Partenaires

Hébergement Web