ASP.NET MVC 3 Beta 1 блокирует доступ к представлениям Razor - PullRequest
9 голосов
/ 13 октября 2010

Есть ли способ заблокировать доступ (404) к представлениям Razor в MVC 3 beta 1?Когда я создаю новый пустой сайт (IIS7) и затем открываю /views/home/index.cshtml из браузера, вместо 404 я получаю этот

    [InvalidCastException: Unable to cast object of type 'ASP.Index_cshtml' to type 'System.Web.IHttpHandler'.]
   System.Web.WebPages.WebPageHttpHandler.CreateFromVirtualPath(String virtualPath, VirtualPathFactoryManager virtualPathFactoryManager) +56
   System.Web.WebPages.WebPageRoute.DoPostResolveRequestCache(HttpContextBase context) +253
   System.Web.WebPages.WebPageHttpModule.OnApplicationPostResolveRequestCache(Object sender, EventArgs e) +89
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +148
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

По умолчанию файл web.configпапка views настроена на блокировку всех файловых запросов, но, очевидно, этот запрос все еще обрабатывается.

Шаги для воспроизведения: Файл -> Новый проектВеб-приложение ASP.NET MVC 3Интернет-приложение (бритва)F5Перейдите к /views/home/index.cshtml

Ответы [ 3 ]

9 голосов
/ 02 декабря 2010

Я ведущий разработчик в команде ASP.NET, работающей над ASP.NET MVC 3 и ASP.NET Web Pages и Razor.

Это не полностью исправлено в ASP.NET MVC 3 RC, но будет полностью исправлено в ASP.NET MVC 3 RTM.

Ничего «ужасно плохого» не происходит в ASP.NET MVC 3 RC или более ранних версиях: самое худшее, что может случиться, это то, что кто-то может обнаружить, существует ли представление в вашем приложении - но они не могут получить это запустить (из-за этого странного исключения). Это небольшая проблема безопасности, поскольку она является формой раскрытия информации, но это не очень серьезная проблема.

В ASP.NET MVC 3 RTM все виды Razor в ~ / Views / ..., а также любые виды Razor в области MVC заблокированы на 100% и не могут быть напрямую запущены браузером. Они будут работать только как страницы просмотра MVC.

4 голосов
/ 19 ноября 2010

Возможно, вы могли бы использовать какие-то правила переписывания в web.config, чтобы перенаправить пользователя из напрямую связанного .cshtml к действующему действию или просто перенаправить / переписать его на страницу 404.

<system.webServer>
    <rewrite>
        <rules>
            <rule name="rule1" patternSyntax="Wildcard" stopProcessing="true">
                <match url="*.cshtml" />
                <action type="Redirect" url="http://www.example.com/some404.html" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

Обновление: более сложная версия для Мариуса Шульца (который проголосовал за это, даже за грубый текайдо, который просил только 404).Это займет URL-адрес типа views/home/index.cshtml?key=value и перенаправит его на home/index?key=value.Это перенаправление 301, но это также может быть Rewrite или некоторый другой код состояния http - подробнее здесь

<rule name="cshtml" stopProcessing="true">
    <match url="^views/([^/]+)/([^.]+)\.(?:cshtml|aspx)" />
    <action type="Redirect" url="{R:1}/{R:2}" />
</rule>

Конечно, это работает без строки запроса (часть ?key=value).Единственный недостаток этого заключается в том, что web.config не знает о ваших зарегистрированных маршрутах (обычно в Global.asax.cs).И, насколько мне известно, сейчас есть способ, которым это возможно.Для этого вам придется написать собственный код.Посмотрите на эту статью Фила Хаака и исходный код, который идет с ней.

(И, пожалуйста, не отказывайтесь от голосования только потому, что он не соответствует вашим потребностям, даже если яотвечая на вопрос другого человека.)

3 голосов
/ 04 июля 2011

Для тех, кто мигрировал из MVC3 RC в RTM, обязательно загляните в \ views \ web.config и добавьте следующую конфигурацию

  <appSettings>
    <add key="webpages:Enabled" value="false" />
  </appSettings>

Это позволит убедиться, что все файлы просмотра (*.cshtml) возвращение 404 не найдено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...