2010-10-13 12 views
9

¿Hay alguna manera de bloquear el acceso (404) a las vistas Razor en MVC 3 beta 1? Cuando se crea un nuevo sitio en blanco de marca (IIS 7) y luego acceder a /views/home/index.cshtml desde el navegador, en lugar de los 404 me sale esteASP.NET MVC 3 Beta 1 Bloque Acceso a las vistas de Navaja

[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 

Por defecto, el archivo web.config en las vistas la carpeta está configurada para bloquear todas las solicitudes de archivos, pero obviamente esta solicitud aún se está procesando.

Pasos para reproducir:
Archivo -> Nuevo proyecto
ASP.NET MVC 3 de aplicaciones web
Aplicación Internet (Razor)
F5
Vaya a /views/home/index.cshtml

+0

¿Podría proporcionar el seguimiento completo de la pila? – marcind

+0

Actualizado con rastro completo de pila y pasos para reproducir. – bkaid

+0

Gracias, puedo confirmar que este es un error válido. – marcind

Respuesta

9

Soy un plomo dev en el equipo de ASP.NET trabajando en tanto ASP.NET MVC 3 como ASP.NET Web Pages y Razor.

Esto no se ha solucionado por completo en ASP.NET MVC 3 RC, pero se solucionará por completo en ASP.NET MVC 3 RTM.

no hay nada "terriblemente malo" que ocurre en ASP.NET MVC 3 RC o anterior: Lo peor que puede pasar es que alguien puede detectar si un punto de vista existe en su aplicación - pero no puede conseguir que se ejecute (debido a esa extraña excepción). Este es un pequeño problema de seguridad ya que es una forma de divulgación de información, pero no es un problema muy grave.

En ASP.NET MVC 3 RTM todas las vistas de Razor en ~/Vistas/... así como cualquier vista de Razor dentro de un Área MVC están 100% bloqueadas y el navegador no las podrá ejecutar directamente. Solo podrán ejecutarse como páginas de vista MVC.

4

Probablemente podría usar algún tipo de reglas de reescritura en web.config para redirigir al usuario desde el archivo .cshtml directamente vinculado a la acción real o simplemente redirigirlo/reescribirlo a una página 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> 

Actualización: Una versión más compleja para Marius Schulz (que votó por esto incluso dura Wasa thekaido pide al usuario 404s). Esto tomará una URL como views/home/index.cshtml?key=value y la redirigirá al home/index?key=value. Es una redirección 301, pero también puede ser una reescritura o algún otro código de estado HTTP - more here

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

Por supuesto, esto funciona sin la cadena de consulta (la parte ?key=value). El único inconveniente de esto es que web.config no conoce sus rutas registradas (generalmente en Global.asax.cs). Y, que yo sepa, ahora hay una forma en que podría hacerlo. Para eso, tendrás que escribir un código personalizado. Mira this article de Phil Haack y el código fuente que lo acompaña.

(Y por favor voto no solo porque no se ajusta a sus necesidades, incluso si estoy respondiendo a la pregunta de otra persona.)

+0

Eso no resuelve el problema - No quiero ignorar estos o mostrar páginas de error 404 pero mostrarlas ... –

+0

la pregunta de thekiado fue sobre 404s. entonces tu voto a la baja fue injusto. Añadiré una versión más compleja que realmente maneja los intentos para obtener el controlador y verlo. – gligoran

3

Para aquellos emigrado de MVC3 RC en RTM, asegúrese de buscar en el \ views \ web.config, y agregue la siguiente configuración

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

Esta es la voluntad de asegurarse de que todos los archivos de vista (*. cshtml) return 404 no encontrado.

+0

Esto fue útil, gracias. – chrisortman

Cuestiones relacionadas