Как вы уже упоминали, фильтрация запросов IIS должна вам помочь.
Вы используете сайт asp.net MVC, поэтому любой запрошенный URL-адрес проверяется на соответствие всем настроенным маршрутам. Это означает, что ваш прикладной уровень используется для ответа 404 на запрос.
В идеале вы хотите получить ошибку 404 раньше в конвейере запросов до того, как будет вызван уровень вашего приложения.
Есть несколько вариантов:
<system.webServer>
<security>
<requestFiltering>
<denyUrlSequences>
<add sequence="/system/login" />
</denyUrlSequences>
<hiddenSegments>
<add segment="system" />
</hiddenSegments>
<filteringRules>
<filteringRule name="systemLogin" scanUrl="true" scanQueryString="false">
<denyStrings>
<add string="system/login" />
</denyStrings>
</filteringRule>
</filteringRules>
</requestFiltering>
</security>
</system.webServer>
Вы должны просто поиграть с тем, какой из них лучше всего подходит для вас и не влияет на ваше собственное приложение.
Если вы включите Failed Request Tracing, вы сможете увидеть, где в конвейере был создан ответ 404. В моем тесте без фильтрации запросов ошибка 404 была создана в позиции 232 в конвейерной обработке, а при использовании фильтрации запросов она была создана в позиции 72 намного раньше и до того, как был вызван уровень вашего приложения.
Да, веб-брандмауэр перед вашим сервером IIS был бы еще лучше, но ему не хватает того, чтобы IIS мог обнаруживать эти запросы до того, как они попадут в ваше приложение.
Убедитесь, что ваши пользовательские страницы ошибок настроены правильно и не говорите ничего, кроме 404.