IIS7: Как заблокировать доступ с помощью файла web.config?

14

Я знаю, что IIS7 позволяет мне иметь конфигурацию для каждого каталога с файлом web.config xml. У меня есть каталог с некоторыми файлами конфигурации, которые не хотят быть доступными через Интернет. Хорошим решением будет локальный файл web.config, запрещающий доступ к нему для чтения.

Каким должно быть содержимое файла web.config, чтобы запретить веб-доступ к файлам?

Изменить: я пытаюсь поместить файл web.config с этим содержимым в файл:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
            <system.web>
                    <authorization>
                            <deny users="*" /> <!-- Denies all users -->
                    </authorization>
            </system.web>
</configuration>

Но я все еще могу получить прямой доступ к файлу внутри каталога. Что с этим не так? Как мне отладить, что происходит?

Невиш
источник

Ответы:

12

Вы используете system.web. В IIS7 вы должны использовать system.webServer. Это заблокирует все типы файлов, а не только файлы ASP.NET. Например, вы можете защитить паролем jpg, gif, txt и все типы файлов.

Это будет выглядеть примерно так:

  <system.webServer>
      <security>
          <authorization>
              <remove users="*" roles="" verbs="" />
              <add accessType="Allow" roles="Administrators" />
          </authorization>
      </security>
  </system.webServer>

И если вы хотите установить его только для 1 файла:

 <location path="dontlook.jpg">
     <system.webServer>
         <security>
             <authorization>
                 <remove users="*" roles="" verbs="" />
                 <add accessType="Allow" roles="Administrators" />
             </authorization>
         </security>
     </system.webServer>
 </location>
Скотт Форсайт - MVP
источник
Через год я наткнулся на свой собственный ответ и хотел добавить дополнительную заметку. Вы должны убедиться, что авторизация форм или Windows также включена, иначе будет полезно только правило удаления. Если вы включили проверку подлинности Windows, вам будет предложено ввести свои учетные данные.
Скотт Форсайт - MVP
+1 Наконец-то! Потратил 3 часа, чтобы найти это! Спасибо
hofnarwillie
5

Я думаю, что это может решить вашу проблему.
поместите этот файл web.config в каталог, содержащий целевой каталог:

<configuration>
 <system.webServer>
  <security>
   <requestFiltering>
    <hiddenSegments>
     <add segment="target directory name"/>
    </hiddenSegments>
   </requestFiltering>
  </security>
 </system.webServer>
</configuration>
Реза Рошан
источник
2
Не могли бы вы проверить это перед отправкой в ​​качестве ответа.
Джеймс Молер
Это работает для меня. Также обратите внимание, что вы можете поместить имя файла в качестве сегмента.
Soenhay
4

Вы можете использовать узлы Location на Web.config. Вот подробное объяснение MSDN ; в двух словах:

<location path="Subdirectory">
    <system.web>
        <authorization>
            <deny users="*"/> <!-- Denies all users -->
        </authorization>
    </system.web>
</location>
<location path="Public_Directory">
    <system.web>
        <authorization>
            <allow users="*"/> <!-- Allows all users -->
        </authorization>
    </system.web>
</location>

Вы также можете использовать? Подстановочный знак для указания того, что вы должны (разрешить / запретить) анонимных пользователей

Джонни Д. Кано
источник
Как этот файл заблокирует доступ к текущему каталогу, но разрешит доступ к каталогу "css"? вокруг него отсутствует тег <configuration>.
Neve
Ваше разрешение позволяет только авторизованным пользователям. Если вы хотите, чтобы пользователи не прошли проверку подлинности, вы должны включить allow users = "?" также.
Nissan Fan
0
  • * означает каждого вошедшего в систему пользователя.
  • ? означает анонимных пользователей.

Вы должны использовать ?.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.web>
        <authorization>
            <deny users="?" /> 
        </authorization>
    </system.web>
</configuration>
Marooned
источник