2010-08-09 12 views
5

Estoy construyendo un sitio ASP.NET MVC 2 en el que estoy usando el parámetro OutputCache en gran medida. Sin embargo, tengo una preocupación: el uso de tal caché puede interferir con la autenticación.Usar ASP.NET MVC OutputCache mientras varía Ver contenido según si el usuario está autenticado

En todas mis páginas, muestro si el usuario está conectado o no. Además, en algunas de mis Vistas, hago el filtrado basado en la función del usuario para determinar si mostrar o no el contenido de una página (por ejemplo, el Editar enlace en una de mis páginas solo se muestra a los usuarios en las funciones de Moderador o Administrador).

¿Usaré OutputCache para interferir con este cambio dinámico de mis Vistas? En caso afirmativo, ¿cómo puedo resolver este problema sin eliminar el almacenamiento en caché?

Respuesta

8

Los atributos [OutputCache] y [Authorize] funcionan bien entre sí. El método AuthorizeAttribute.OnAuthorization() establece un gancho en el sistema de almacenamiento en caché de salida que obliga al filtro de autorización a volver a ejecutarse antes de que la página se sirva desde el caché. Si falla la lógica del filtro de autorización, se tratará como una falta de caché. Si la lógica de autorización tiene éxito, la página se publicará desde la memoria caché. Por lo tanto, si tiene [Autorizar (Roles = "Moderador, Administrador")] y [OutputCache] en una acción, la página no se servirá desde la memoria caché a menos que el usuario actual esté en las funciones de Moderador o Administrador.

Tenga en cuenta que este no varía según el usuario o el rol; está literalmente volviendo a ejecutar el cheque original. Imagine que el usuario A (que es un moderador) entra y hace que la página se guarde en caché. Ahora el usuario B (que es un administrador) entra y acierta en la página almacenada en caché. El [Autorizar] cheque tendrá éxito ya que ambos Administrador y Moderador están permitidos, y la respuesta servido al usuario B contendrá los mismos contenidos exactos como la respuesta que se sirvió a usuario A.

Nota que la sustitución de respuesta no lo hace trabajar en MVC 2. Si está sirviendo datos potencialmente confidenciales, la mejor opción aquí es no almacenarlos en caché. Si necesita caché absolutamente, puede imitar algo similar a la sustitución de respuesta utilizando una devolución de llamada AJAX para completar dinámicamente los datos faltantes.

+2

¿Qué sucede si tengo un método que no requiere autorización pero agrega un enlace Editar dentro de la Vista si el usuario es moderador? En este caso, estoy tratando de lograr algo que se asemeje a cómo funcionan el enlace, la marca, la edición y otros botones de una pregunta o respuesta. ¿No usa también OutputCache? ¡Gracias por tu respuesta! –

+0

Me encontré con http://blog.stevensanderson.com/2008/10/15/partial-output-caching-in-aspnet-mvc/ (sobre un viejo problema que luego se solucionó), lo que me dio una idea: si OutputCache es tan malo con esto, ¿es posible ** crear un atributo/filtro de almacenamiento en caché personalizado ** que cree copias diferentes en función de si el usuario ha iniciado sesión y en qué funciones está el usuario, o mejor aún, qué nombre de usuario es, ya que voy a escribir el nombre del usuario en la parte superior de la página - ** ¿es posible **? –

+0

En general, es una mala idea guardar en caché por usuario, ya que su caché se verá inundada de entradas. Si el almacenamiento en caché de donuts es importante para su escenario, también puede usar un filtro de respuesta. Al comienzo de la solicitud, instale un filtro que comprenda algunos [!! ¡DATOS DE SUSTITUCIÓN!], Haga que su WriteSubstitute() escriba este patrón en el flujo de respuesta, luego, al final de la solicitud, su filtro llamará al método Response.WriteSubstitution() real. – Levi

0

Creo que lo que necesitas es caché de donat ASP.NET. Ver here para una buena explicación. No me sorprendería si SO utiliza algo así para el área de la barra superior.

+1

Ese enlace dice que no se recomienda hacer eso en MVC2 ... –

+0

¡El almacenamiento en caché parcial está disponible de nuevo en MVC 3! ¡Woot! – madcapnmckay

Cuestiones relacionadas