2009-09-17 28 views
5

Estoy confundido con el almacenamiento en caché y la autorización de ASP.NET MVC y en la necesidad urgente de alguna aclaración.Autorización y ASP.NET MVC Caching

Mi atributo de autorización hecho a sí mismo hereda de AuthorizeAttribute. Su método AuthorizeCore reemplazado se ejecuta siempre, incluso si configuré un atributo [OutputCache] en una acción del controlador. Yo entiendo esa parte.

Ahora el doblador de la mente para mí: AuthorizeCore se fallar cada vez que ahora, cuando en realidad hago memoria caché de salida y la página se sirve de la caché. La razón es que cuando la solicitud se almacena en caché, el httpContext.Session suministrado con AuthorizeCore es null? Aquí hay un código simplificado:

protected override bool AuthorizeCore(HttpContextBase httpContext) { 
    return (Session["userId"] != null) 
} 

Así que si httpContext.Session es null, esto, obviamente, cada vez que falla. Sin embargo, necesito acceder a la sesión, ¿de qué otra manera puedo verificar si la solicitud está autorizada? Esto no tiene ningún sentido - si así es como debería ser entonces nunca ser capaz de usar páginas en caché junto con la autenticación en ASP.NET MVC. ¿Ayuda?

Respuesta

11

Hay dos cuestiones distintas:

  1. Cómo funciona la autenticación con el almacenamiento en caché en MVC?
  2. ¿La sesión funciona antes de la autenticación frente a un caché (incluso para usuarios no autenticados, que aún tienen una sesión con suerte única)?

Las respuestas, respectivamente, son sí y no. La autenticación funciona bien con el almacenamiento en caché. Pruébelo con los proveedores de membresía SQL o Domain; verás.

El almacenamiento en caché, sin embargo, puede ejecutarse antes del módulo de autenticación. (Para los puntos de bonificación: ¿por qué?) Se llama a la autenticación solo si engancha específicamente la caché (como lo hace AuthorizeAttribute). Debido a que las sesiones son específicas del usuario, existe no que garantiza que tendrá una sesión dentro de AuthorizeCore.

Más puntos de bonificación: ¿Cómo podría cambiar esto si especifica varyByUser en la configuración de caché?

Desafortunadamente, hacer bien la autenticación es difícil, porque hacer cualquier tipo de derecho de seguridad es difícil. Microsoft intenta hacer esto más fácil con la API del proveedor de membresía. I strongly recommend using that al implementar autenticación personalizada. También recomiendo usar los proveedores integrados y ampliarlos en lugar de reescribirlos siempre que sea posible.

Otro punto: El proveedor de sesión ASP.NET y el proveedor de membresía ASP.NET son completamente por separado. Los usuarios diferentes miembros pueden compartir (!) Una sesión y, yes, puede attack un sitio de esta manera. Es nunca seguro para poner información relacionada con la seguridad en una sesión. La seguridad es difícil.

+0

Entonces, ¿está diciendo que si tuviera que utilizar un proveedor de membresía personalizado basado en el proveedor de membresía asp.net regular podría verificar la autenticación del usuario con el almacenamiento en caché? ¿Por qué funciona eso? El proveedor de membresía necesita la sesión también internamente, ¿no? – Alex

+1

Nunca es seguro poner información sensible a la seguridad en la sesión, punto. –

+1

Y no, el proveedor de membresía regular no tiene casi nada que ver con la Sesión. Lea los dos últimos enlaces en mi respuesta. –