PHP Windows IIS 7.5 上的领域身份验证

PHP Realm Authentication on Windows IIS 7.5

我需要在 Windows IIS 7.5 Web 服务器上的 PHP 站点 运行 上的文件夹上使用领域身份验证。我在下面有以下代码,该代码适用于该目录中的任何 .php 文件。

问题是我需要用密码保护对 整个 目录的访问,包括 PDF、图像文件、css 文件等。我无法放置 PHP 那些类型文件的代码。

我确实在服务器上安装了 IIS 重写模块,所以我假设我可以以某种方式在我的 web.config 中添加一个重写,它可以强制所有文件通过某种 pass-through/handler PHP 文件。

我只是不知道该怎么做。

<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
    header('WWW-Authenticate: Basic realm="Jonas Realm"');
    header('HTTP/1.0 401 Unauthorized');
    echo 'User pressed Cancel';
    exit;
} else {
    echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
    echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as you password.</p>";
}
?>

我已经回复了 ,不同之处在于您使用的是 ISS 而不是 Apache,并且您想要提供所有文件而不仅仅是几种类型。

这是完整的 web.config 或者您可以只复制 <rule> 标签。此规则将匹配所有文件,但扩展名为 php 的文件除外(请勿 negate=true)。您必须将其更改为您的特定要求。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <directoryBrowse enabled="false" />
    <rewrite>
      <rules>
            <rule name="Authentication" stopProcessing="false">
                <match url="^(.*)$" negate="false" />
                <action type="Rewrite" url="validate.php?path={R:0}" appendQueryString="true" />
                <conditions>
                    <add input="{REQUEST_FILENAME}" matchType="IsFile" />
                    <add input="{QUERY_STRING}" pattern="^(.*\.php)$" negate="true" />
                </conditions>
            </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

这里是我使用的 isAuthenticated.php 文件的不同版本,并使用了您发布的一些代码。

$blacklistExtensions = array();

$path = $_SERVER["DOCUMENT_ROOT"].DIRECTORY_SEPARATOR.$_REQUEST["path"];
$pathInfo = pathinfo($path);

if(in_array($pathInfo["extension"], $blacklistExtensions)) {
    header("HTTP/1.1 403 Forbidden");
    exit;
}

if (!isset($_SERVER['PHP_AUTH_USER'])) {
    header('WWW-Authenticate: Basic realm="Jonas Realm"');
    header('HTTP/1.0 401 Unauthorized');
    exit;
}

if(!file_exists($path)) {
    header("HTTP/1.1 404 Not Found");
    exit;
}

// Display the file and set the correct mimetype
$resource = finfo_open(FILEINFO_MIME_TYPE);
$mimetype = finfo_file($resource, $path);
finfo_close($resource);

header("Content-Type: ".$mimetype);
readfile($path);

希望这可以帮助您开始寻找解决此问题的方法:)