¿Cómo protejo los archivos estáticos con la autenticación de formulario ASP.NET en IIS 7.5?

Tengo un sitio web que se ejecuta en un servidor IIS 7.5 con ASP.NET 4.0 en un host compartido, pero con plena confianza.

El sitio es un “buscador de archivos” básico que permite a los visitantes iniciar sesión y mostrar una lista de los archivos disponibles y, obviamente, descargar los archivos. Los archivos estáticos (en su mayoría archivos PDF) se encuentran en una subcarpeta en el sitio llamada datos, por ejemplo, http://example.com/data/ …

El sitio utiliza autenticación de formulario ASP.NET.

Mi pregunta es: ¿cómo consigo que el motor ASP.NET maneje las solicitudes de los archivos estáticos en la carpeta de datos, por lo que ASP.NET autentica la solicitud de archivos y los usuarios no pueden realizar un enlace profundo a un archivo y agarrar archivos que no tienen permitido tener?

Saludos cordiales, Egil.

Si su grupo de aplicaciones se ejecuta en modo integrado, puede hacer lo siguiente.

Agregue lo siguiente a su nivel superior web.config.

         

Ahora puede usar los permisos estándar de ASP.NET en su web.config para forzar la autenticación de formularios para todos los archivos en el directorio.

       

Tuve el mismo problema al obtener roles para autenticar. A través del método de prueba y error finalmente logré que funcionara con una pequeña edición del código de @Joel Cunningham:

  

Utilicé estos dos sitios como referencias: http://forums.iis.net/t/1177964.aspx y http://learn.iis.net/page.aspx/244/how-to-take-advantage-of- the-iis-integrated-pipeline /

Este es un hilo viejo, pero sucedió y tuve el mismo problema que Egil. Aquí está la versión de la corrección de Joel que incluye roles:

           

Quería saber por qué sería necesario volver a agregar módulos (con opciones predeterminadas) que se agregan de manera predeterminada para la Tubería integrada, así que profundicé un poco más.

Debe eliminar y volver a agregar los módulos porque, de forma predeterminada, los módulos no se agregan con las opciones predeterminadas. Tienen una condición previa añadida para que la compatibilidad con versiones anteriores se ejecute solo para el contenido manejado por un controlador ASP.NET registrado (por ejemplo, páginas .aspx).

El valor predeterminado es así:

  

Al eliminar los módulos y volver a agregarlos sin una condición previa, esos módulos individuales se ejecutan para cada solicitud (incluido el contenido estático). Es más detallado que habilitar runAllManagedModulesForAllRequests .

Puede leer sobre esto en un par de artículos sobre cuándo se introdujo Integrated Pipeline con IIS 7:

  • Integración ASP.NET con IIS 7
  • Cómo aprovechar la canalización integrada de IIS 7.0

Tenga en cuenta que hay un error tipográfico o el nombre del módulo en el segundo artículo (y la respuesta de @ John) se cambió de FormsAuthenticationModule a FormsAuthentication en algún momento.

El conjunto de módulos de trabajo en IIS 7.5 a 8.5 se parece a esto para mí:

              

Apéndice:

Como @eych notó, esto también bloquea el acceso a la carpeta ~/Content (o donde tenga su CSS), y ~/Scripts , y así sucesivamente.

Si desea permitir excepciones, es decir, permitir que ciertos archivos / carpetas sean accesibles para usuarios no autenticados, puede hacerlo a través del elemento de location . Agregue lo siguiente a web.config :

         

Actualización: una mejor solución es dejar el acceso de forma predeterminada, lo que permitirá el acceso a su CSS / JavaScript / etc., y aplicar el “locking” (solo) a la carpeta donde se almacena el contenido estático:

        

Advertencia: en nuestro caso (un sitio de MVC) necesitábamos decorar todas nuestras acciones de controlador (excepto el inicio de sesión) con [AuthorizeAttribute] . Lo cual es una buena idea de todos modos, pero anteriormente no había sido necesario (porque anteriormente cualquier solicitud no autorizada se redirigía a la página de inicio de sesión).

Si su grupo de aplicaciones se ejecuta en modo clásico, puede hacer lo siguiente. Tendrá que repetir estos pasos para cada extensión de archivo que quiera manejar, pero estoy usando .html aquí.

Primero, agregue un proveedor de creación de página al Web.config:

           

A continuación, agregue una fábrica de controladores de página:

         

A continuación, agregue un manejador de página:

          

Esto funcionó para mí. (Crédito: http://www.ifinity.com.au/Blog/EntryId/66/How-To-301-Redirect-htm-or-html-pages-to-DotNetNuke-aspx-pages .)