web-dev-qa-db-fra.com

Authentification intégrée Windows dans le client node.js

Lorsque vous utilisez node.js en tant que client, est-il possible de se connecter à un serveur à l'aide de l'authentification intégrée Windows (par exemple, lors de la connexion à IIS)?

Mes recherches ne font que générer des résultats là où node.js est utilisé en tant que serveur.

19
laktak

Mise à jour: Certains modules implémentent maintenant l'authentification intégrée à Windows. node-sspi utilise SSPI (l'API de sécurité Windows) pour gérer le côté serveur de choses, mais ne fait pas l'authentification du client . Il existe plusieurs implémentations client telles que http-ntlm , mais elles ne sont pas réellement intégrées car elles nécessitent le mot de passe de l'utilisateur. n'utilisez pas SSPI pour effectuer une authentification transparente.


"Authentification intégrée Windows" est ce qu'on appelle l'authentification NTLM. Lorsque vous recevez un HTTP 401 de IIS avec un en-tête WWW-Authenticate contenant NTLM, vous avez maintenant le plaisir d'implémenter le protocole d'authentification NTLM. Citant ce document sur le protocole d’authentification NTLM :


  1. Le client demande une ressource protégée au serveur:

    GET /index.html HTTP/1.1
    
  2. Le serveur répond avec un statut 401, indiquant que le client doit s'authentifier. NTLM est présenté comme un mécanisme d'authentification pris en charge via l'en-tête WWW-Authenticate. En règle générale, le serveur ferme la connexion à ce moment:

    HTTP/1.1 401 Unauthorized
    WWW-Authenticate: NTLM
    Connection: close
    

    Notez qu'Internet Explorer ne sélectionnera NTLM que s'il s'agit du premier mécanisme proposé. Cela est contraire à la norme RFC 2616, qui stipule que le client doit sélectionner le schéma d'authentification pris en charge le plus puissant.

  3. Le client soumet à nouveau la demande avec un en-tête Authorization contenant un paramètre Type 1 message . Le message de type 1 est codé en Base 64 pour la transmission. À partir de ce moment, la connexion est maintenue ouverte. la fermeture de la connexion nécessite la réauthentification des demandes suivantes. Cela implique que le serveur et le client doivent prendre en charge les connexions persistantes, via l'en-tête "Keep-Alive" de type HTTP 1.0 ou HTTP 1.1 (dans lequel les connexions persistantes sont utilisées par défaut). Les en-têtes de requête pertinents apparaissent comme suit:

    GET /index.html HTTP/1.1
    Authorization: NTLM TlRMTVNTUAABAAAABzIAAAYABgArAAAACwALACAAAABXT1JLU1RBVElPTkRPTUFJTg==
    
  4. Le serveur répond avec un état 401 contenant un message de type 2 dans l'en-tête WWW-Authenticate (à nouveau, codé en Base 64). Ceci est montré ci-dessous.

    HTTP/1.1 401 Unauthorized
    WWW-Authenticate: NTLM TlRMTVNTUAACAAAADAAMADAAAAABAoEAASNFZ4mrze8AAAAAAAAAAGIAYgA8AAAARABPAE0AQQBJAE4AAgAMAEQATwBNAEEASQBOAAEADABTAEUAUgBWAEUAUgAEABQAZABvAG0AYQBpAG4ALgBjAG8AbQADACIAcwBlAHIAdgBlAHIALgBkAG8AbQBhAGkAbgAuAGMAbwBtAAAAAAA=
    
  5. Le client répond au message de type 2 en soumettant à nouveau la demande avec un en-tête Authorization contenant un message de type 3 codé en Base 64 :

    GET /index.html HTTP/1.1
    Authorization: NTLM TlRMTVNTUAADAAAAGAAYAGoAAAAYABgAggAAAAwADABAAAAACAAIAEwAAAAWABYAVAAAAAAAAACaAAAAAQIAAEQATwBNAEEASQBOAHUAcwBlAHIAVwBPAFIASwBTAFQAQQBUAEkATwBOAMM3zVy9RPyXgqZnr21CfG3mfCDC0+d8ViWpjBwx6BhHRmspst9GgPOZWPuMITqcxg==
    
  6. Enfin, le serveur valide les réponses dans le message de type 3 du client et autorise l'accès à la ressource.

     HTTP/1.1 200 OK
    

Vous devrez trouver comment répondre au défi du message de type 2 , où le mot de passe de l'utilisateur est haché MD4 et utilisé pour créer les clés DES. pour chiffrer les données du challenge.

Je ne sais pas comment vous obtiendrez l'accès aux données d'identification de l'utilisateur connecté qui vous permettrait d'accomplir cela, bien que cela implique de rédiger un addon C++ natif afin que vous puissiez parler à l'API Windows nécessaire. Ou, je suppose que vous pourriez simplement demander le mot de passe de l'utilisateur.

Alternativement, vous pouvez proxyer vos requêtes Node via un logiciel gérant le désordre NTLM pour vous .

27
josh3736

Pour Kerberos:

  • noeud-sspi

    Just on windows
    No client side node
    Supports NTLM too
    
  • passeport-negocier

    Needs python on the server
    it's a passportJs strategy
    

Pour NTLM

  • noeud-sspi

    Just on windows
    No client side node
    Supports Kerberos too
    
  • httpntlm 
  • express-ntlm
  • demande-ntlm
  • ntlm

    experimental project!
    
  • ntlm-auth 

        experimental!
    
  • passeport-ntlm

        supports SMB protocol
        it's a passportJs strategy
    

J'ai choisi passeport-négocier pour Kerberos et express-ntlm pour NTLM 

2
DaNeSh

Pour le côté client, l’utilisation de node-libcurl pour les appels REST/HTTP.

voici un exemple de code:

var endpoint = urlString;
var url = require("url");
var endpointUrl = url.parse(endpoint);

var Curl = require( 'node-libcurl' ).Curl;
var curl = new Curl();

curl.setOpt( 'USERNAME', '' );
//curl.setOpt( 'VERBOSE', 1 );
curl.setOpt( 'URL', endpoint );
curl.setOpt( 'HTTPAUTH', Curl.auth.NEGOTIATE );
curl.setOpt( 'NOPROXY', endpointUrl.hostname );

curl.on( 'end', function( statusCode, body, headers ) {

    if (statusCode === 200) {
        console.log(body);
        cb(null, { statusCode, body, headers } ); 
    } else {
        cb(new Error(), { statusCode, body, headers } ); 
    }

    this.close();
});

curl.on( 'error', curl.close.bind( curl ) );
curl.perform();
0
zumalifeguard