2010-02-24 4 views
4

J'ai un site Web ASP.NET qui utilise l'authentification des formulairesaccès ticket d'authentification ASP.NET sur le client (via javascript)

<authentication mode="Forms"> 
     <forms name="NewsCoreAuthentication" loginUrl="~/Default.aspx" defaultUrl="~/Default.aspx" protection="Validation" timeout="300" domain="someRootDomain.com" /> 
    </authentication> 

Je dois identifier si l'utilisateur est authentifié sur la page Web après qu'il a été rendu au client . Pour ce faire, j'ai pensé que je peux lire document.cookie et vérifier si ".ASPXAUTH" est là. Mais le problème est que même si je suis signé dans cette valeur est vide.

Comment puis-je vérifier que cet utilisateur est authentifié? Pourquoi document.cookie est vide?


Merci pour vos réponses. blowdart m'a aidé à comprendre pourquoi le ticket d'authentification n'est pas accessible depuis le script client.

+0

@pavlo, vous pouvez vérifier à partir du client. il y a un mécanisme spécifiquement conçu pour que ma MS fasse exactement cela à partir du script client. Il est propre et rapide, il n'y a pas d'activité de disque, il lit juste le cookie pour vous et renvoie un booléen.vois ma réponse avant d'abandonner. –

Répondre

5

La raison pour laquelle il est vide est parce que le cookie est protégé en étant marqué comme HttpOnly. Cela signifie qu'il n'est pas accessible via un script. La désactiver est une très mauvaise idée, car les vulnérabilités XSS sur votre site pourraient l'exposer au vol de cookies, donc je ne vais pas vous dire comment vous pouvez le faire.

+0

Merci, vous avez raison. Cette réponse m'a aidé. Je peux ajouter un drapeau pour cookie moi-même pour identifier si l'utilisateur est authentifié. –

+1

Kinda a surpris que personne ne mentionne que le nom de cookie serait 'NewsCoreAuthentication' et non pas' .ASPXAUTH', bien que cela ne soit pas pertinent avec l'option HttpOnly activée, je suppose. –

0

Numéro un ... c'est une mauvaise idée. Il n'y a absolument aucune sécurité à vérifier si un utilisateur est autorisé du côté client. Aucun.

Mais si vous voulez vraiment faire cela ... faites le check-in derrière le code, et poussez une valeur au client qui peut être lue via Javascript. Quelque chose de semblable à:

RegisterClientScript ("isvalidated", "var isUserAuthenticated =" + UserAuthenticated);

Vous voyez le problème maintenant? Vous pourriez faire la même chose avec AJAX ... mais le problème est le même. OK, je peux voir cela comme une simple commodité pour l'utilisateur ... montrant certains liens s'ils sont autorisés par exemple. Mais il n'est pas sécurisé de quelque manière que ce soit. Fais-toi plaisir et traite-le en code-behind.

+0

Une bonne remarque et des conseils, mais la raison pour laquelle j'ai besoin de cette vérification sur le client est parce que les pages sont traitées par IIS (htm et html). AJAX est une bonne idée, mais comme la charge sur le site Web est élevée, je ne peux pas me permettre un appel à la page ASP.NET (ou gestionnaire). Après vérification, j'indiquerai dans IFRAME une page sécurisée. Donc, ce drapeau dans le cookie ne cause pas de problème de sécurité. Merci de votre réponse! –

1

Comme d'autres l'ont dit, le ticket d'authentification est et DEVRAIT être httponly.

La meilleure façon d'y parvenir est d'utiliser ApplicationServices. Le point de terminaison d'authentification JSON expose IsLoggedIn et j'ai remarqué votre préoccupation concernant la charge du serveur. La surcharge d'un appel à un point de terminaison statique qui vérifie simplement le cookie pour vous est négligeable. Vraiment. Donc, si vous utilisez MsAjax, activez les services d'application et appelez Sys.Services.AuthenticationService.IsLoggedIn.

Si vous voulez faire de javascript brut est ici la codez ;-)

Ajouter ce segment à vous de fichier config

<system.web> 
    ------------ 
    </system.web> 
    <system.web.extensions> 
    <scripting> 
     <webServices> 
     <authenticationService enabled ="true" requireSSL="false"/> 
     </webServices> 
    </scripting> 
    </system.web.extensions> 

La page ....

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title></title> 

    <script type="text/javascript"> 
     function createXHR() { 
      // a memoizing XMLHttpRequest factory. 
      var xhr; 
      var factories = [ 
        function() { return new XMLHttpRequest(); }, 
        function() { return new ActiveXObject("Msxml2.XMLHTTP"); }, 
        function() { return new ActiveXObject("Msxml3.XMLHTTP"); }, 
        function() { return new ActiveXObject("Microsoft.XMLHTTP"); } ]; 
      for (var i = 0; i < factories.length; i++) { 
       try { 
        xhr = factories[i](); 
        // memoize the factory so we don't have to look for it again. 
        createXHR = factories[i]; 
        return xhr; 
       } catch (e) { } 
      } 
     } 

     function isLoggedIn() { 
      var xhr = createXHR(); 
      xhr.open("POST", "/Authentication_JSON_AppService.axd/IsLoggedIn", true); 
      xhr.onreadystatechange = function() { 
       if (this.readyState === 4) { 
        if (this.status != 200) { 
         alert(xhr.statusText); 
        } else { 
         alert("IsLoggedIn = " + xhr.responseText); 
        } 
        xhr = null; 
       } 
      }; 
      xhr.setRequestHeader("content-type", "application/json"); 
      xhr.send(null); 
     } 
    </script> 

</head> 
<body> 
    <input type="button" value="IsLoggedIn?" onclick="isLoggedIn()" /> 
</body> 
</html> 
Questions connexes