Ответ 1
[TL; DR;]
Перейдите в раздел "Полный root web.config" , чтобы увидеть необходимую настройку web.config.
Проверьте это в режиме инкогнито, чтобы предотвратить проблемы кэширования браузера!
И используйте Ctrl+F5
, потому что скрипты и html файлы становятся кэшированными.
Сначала запретите доступ ко всем анонимным пользователям в корневом web.config.
<authorization>
<deny users="?"/>
</authorization>
Здесь web.config позволяет одной папке публично доступной. Эта папка в моем примере здесь называется css
и находится в корневом каталоге приложения MVC. Для папки css я добавляю следующую авторизацию в корневой web.config:
<location path="css">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
Вы можете добавить больше этих путей расположения, если хотите больше общих папок.
Пока все остальные файлы не будут доступны, пока пользователь не войдет в систему, папка css и ее содержимое всегда будут доступны.
Я также добавил статический обработчик файлов в корневой web.config, Это очень важно, так как вы хотите, чтобы запрос управлялся конвейером asp.net для определенного типа (ов) файла
<handlers>
<add name="HtmlScriptHandler" path="*.html" verb="*" preCondition="integratedMode" type="System.Web.StaticFileHandler" />
</handlers>
Полный корневой web.config
<system.web>
<authentication mode="None" />
<authorization>
<deny users="?"/>
</authorization>
<compilation debug="true" targetFramework="4.6.2" />
<httpRuntime targetFramework="4.6.2" />
</system.web>
<location path="css">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
<system.webServer>
<modules>
<remove name="FormsAuthentication" />
<remove name="UrlAuthorization" />
<add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" />
</modules>
<handlers>
<add name="HtmlScriptHandler" path="*.html" verb="*" preCondition="integratedMode" type="System.Web.StaticFileHandler" />
</handlers>
</system.webServer>
ASP.NET по умолчанию будет применять правила allow и deny к файлам, обрабатываемым управляемым обработчиком. Статические файлы не управляются управляемым обработчиком.
Вы также можете установить: (Не делать этого, если не нужно!)
<modules runAllManagedModulesForAllRequests="true">
С runAllManagedModulesForAllRequests="true"
все HTTP-модули будут выполняться на каждом запросе, а не только на управляемые запросы (например,.aspx, ashx). Это означает, что модули будут выполняться на каждом запросе .jpg,.gif,.css,.html,.pdf,....
Одна важная вещь
Вам не нужно добавлять модуль UrlAuthorizationModule в раздел модулей, поскольку он уже является частью конвейера ASP.NET. Это означает, что он будет работать только для управляемых файлов, а не для статичных!
Если вы теперь удалите, а затем снова добавите UrlAuthorizationModule в раздел модулей, он будет работать в предварительном режиме "IntegratedMode", а не под "managedHandler" больше! И, следовательно, будет иметь доступ к статическим файлам.
<remove name="UrlAuthorization" />
<add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" />
Если вы настроили предварительное условие:
<add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" preCondition="managedHandler" />
, тогда UrlAuthorizationModule больше не будет ограничивать доступ к статическим файлам.
Вы можете протестировать это, получив доступ к файлу script в папке сценариев успешно во время выхода из системы. Нажмите Ctrl + F5, чтобы получить новую копию файла script.
Разница между ASP.NET UrlAuthorization ↔ Авторизация URL IIS
Важно иметь в виду, что предусловие managedHandler находится в модуле UrlAuthorization ASP.NET. Предварительное условие говорит вам что модуль авторизации URL-адреса вызывается только тогда, когда код, который обрабатывает запрос, сопоставляется с управляемым кодом, как правило,.aspx или .asmx page. С другой стороны, авторизация URL-адреса IIS распространяется на все содержание. Вы можете удалить предварительное условие managedHandler из Модуль авторизации URL-адресов ASP.NET. Это должно предотвратить производительность вы должны платить, когда каждый запрос (например, запрос .html или .jpg) должны пройти управляемый код.
P.S.: Некоторые атрибуты web.config чувствительны к регистру!