0

我正在開發一個新應用程序,並決定使用基本身份驗證保護雲登臺服務器。使用nginx進行基本身份驗證,然後在PHP中進行摘要身份驗證失敗

我使用nginx的,這樣的配置是這樣的:

location/{ 
    auth_basic "Restricted"; 
    auth_basic_user_file .htpasswd; 
    try_files $uri $uri/ @php_mvc; 
} 

我的MVC應用程序也有一個 「管理」 模塊,這是保護使用HTTP摘要:

$realm = 'Access Restricted.'; 
$nonce = md5(uniqid()); 
$opaque = md5(uniqid()); 
$valid = false; 

$headers = System::getallheaders(); 
if (array_key_exists('Authorization', $headers)) { 
    $authHeader = substr($headers['Authorization'], strlen('Digest')); 
    $parsed = array(); 
    foreach (explode(',', $authHeader) as $pair) { 
     if (substr(trim($pair), 0, 4) == ($_u = 'uri=')) { 
      $parsed[substr($_u, 0, -1)] = trim(substr($pair, 5), ' "'); 
     } else { 
      $vals = explode('=', $pair); 
      $parsed[trim($vals[0])] = trim($vals[1], '" '); 
     } 
    } 

    $A1 = md5(self::DIGEST_USERNAME . ':' . $parsed['realm'] . ':' . self::DIGEST_PASSWORD); 
    $A2 = md5($_SERVER['REQUEST_METHOD'] . ':' . $parsed['uri']); 
    $response = md5($A1 . ':' . $parsed['nonce'] . ':' . $A2); 

    $valid = ($response == $parsed['response']); 
} 

if (!$valid) { 
    header('HTTP/1.1 401 Unauthorized'); 
    header('Content-Type: text/html'); 
    header(sprintf('WWW-Authenticate: Digest realm="%s", nonce="%s", opaque="%s"', $realm, $nonce, $opaque)); 
    echo 'Access denied.'; 
    exit(); 
} 

... 

function getallheaders() 
{ 
    $headers = null; 
    foreach ($_SERVER as $name => $value) { 
     if (substr($name, 0, 5) == 'HTTP_') { 
      $name = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5))))); 
      $headers[$name] = $value; 
     } else if ($name == 'CONTENT_TYPE') { 
      $headers['Content-Type'] = $value; 
     } else if ($name == 'CONTENT_LENGTH') { 
      $headers['Content-Length'] = $value; 
     } 
    } 
    return $headers; 
} 

所以,問題是,基於PHP的摘要式身份驗證不起作用,因爲$ _ SERVER [「HTTP_AUTHORIZATION」]到那個時候已經採取的基本身份驗證的結果是:$ _ SERVER [「HTTP_AUTHORIZATION」] =「基本S1aGUzpuZXzzdXRl」。

有沒有辦法區分基本的&摘要認證結果?

謝謝!

回答

0

號您也需要使用相同的認證機制對服務器和後端側(不會與每一個機構工作),或者關閉驗證這些邊。

後者意味着要麼在後端將其關閉,只要相信服務器提供的用戶名(在這種情況下,可以繞過內部網絡中的身份驗證),或者在服務器端將其關閉,然後讓後端完成這項工作。

如果你甚至想在服務器和後端使用不同的用戶名/密碼(並且用戶必須輸入它們),唯一的選擇是在後端實現基於html/cookie/session的登錄頁面並在服務器端使用基於http的身份驗證

相關問題