NTLM身份验证弹出问题

时间:2019-06-09 09:02:33

标签: php ntlm ntlm-authentication

下面的代码可以完美运行,并弹出要求输入Windows用户名的弹出窗口,并输入您输入的所有凭据即可打印

我想直接打印Windows用户名而不使用身份验证弹出窗口,请指导如何在PHP中做到这一点

我已经尝试过下面的代码,并且可以正常工作,但是我只需要回显自动获取的用户名,而不会弹出

<?php

     $headers = apache_request_headers();    // Récupération des l'entêtes client

     if (@$_SERVER['HTTP_VIA'] != NULL){ // nous verifions si un proxy est utilisé : parceque l'identification par ntlm ne peut pas passer par un proxy

          echo "Proxy bypass!";

     } elseif(!isset($headers['Authorization'])) { //si l'entete autorisation est inexistante

          header( "HTTP/‪1.0 401‬ Unauthorized" ); //envoi au client le mode d'identification

          header( "WWW-Authenticate: NTLM" ); //dans notre cas le NTLM

          exit; //on quitte

     }

     if(isset($headers['Authorization']))                //dans le cas d'une authorisation (identification)

     {  

          if(substr($headers['Authorization'],0,5) == 'NTLM '){   // on vérifit que le client soit en NTLM

          $chaine=$headers['Authorization'];                 

          $chaine=substr($chaine, 5);             // recuperation du base64-encoded type1 message

          $chained64=base64_decode($chaine);      // decodage base64 dans $chained64

    if(ord($chained64{8}) == 1){                   

    //        |_ byte signifiant l'etape du processus d'identification (etape 3)       



    // verification du drapeau NTLM "0xb2" à l'offset 13 dans le message type-1-message (comp ie 5.5+) :

        $retAuth = "NTLMSSP".chr(000).chr(002).chr(000).chr(000).chr(000).chr(000).chr(000).chr(000);
        $retAuth .= chr(000).chr(040).chr(000).chr(000).chr(000).chr(001).chr(130).chr(000).chr(000);
        $retAuth .= chr(000).chr(002).chr(002).chr(002).chr(000).chr(000).chr(000).chr(000).chr(000);
        $retAuth .= chr(000).chr(000).chr(000).chr(000).chr(000).chr(000).chr(000);

        $retAuth64 =base64_encode($retAuth);        // encode en base64

        $retAuth64 = trim($retAuth64);          // enleve les espaces de debut et de fin

       // header( "HTTP/‪1.0 401‬ Unauthorized" );      // envoi le nouveau header

        header( "WWW-Authenticate: NTLM $retAuth64" );  // avec l'identification supplémentaire

        exit;

    } else if(ord($chained64{8}) == 3) {

    //             |_ byte signifiant l'etape du processus d'identification (etape 5)

        // on recupere le domaine

        $lenght_domain = (ord($chained64[31])*256 + ord($chained64[30])); // longueur du domain

        $offset_domain = (ord($chained64[33])*256 + ord($chained64[32])); // position du domain.   

        $domain = str_replace("\0","",substr($chained64, $offset_domain, $lenght_domain)); // decoupage du du domain

        //le login

        $lenght_login = (ord($chained64[39])*256 + ord($chained64[38])); // longueur du login.

        $offset_login = (ord($chained64[41])*256 + ord($chained64[40])); // position du login.

        $login = str_replace("\0","",substr($chained64, $offset_login, $lenght_login)); // decoupage du login

        $lenght_host = (ord($chained64[47])*256 + ord($chained64[46]));

        $offset_host = (ord($chained64[49])*256 + ord($chained64[48]));

        $host = str_replace("\0","",substr($chained64, $offset_host, $lenght_host));

        if ( $login != NULL){

            echo $login;

        } else {

            echo "NT Login empty!";

          }

      }

  }

}

 ?>

0 个答案:

没有答案