2010-05-14 38 views
6

Solo soy un recién llegado a ASP.NET MVC y no estoy seguro de cómo lograr una determinada tarea de la "manera correcta".ASP.NET MVC AuthorizeAttribute pasando valores a ActionMethod?

Esencialmente, almaceno el ID de usuario conectado en HttpContext.User.Identity y he escrito un EnhancedAuthorizeAttribute para realizar alguna autorización personalizada.

En el método OnAuthorization modificado, mi modelo de dominio llega a la base de datos para garantizar que la identificación de usuario actual pueda acceder a la aprobada en routeValue "BatchCode". El prototipo es:

ReviewGroup GetReviewGroupFromBatchCode(string batchCode); 

Se devolverá un valor nulo si el usuario no puede acceder a la ReviewGroup y la OnAuthorization y niega el acceso.

Ahora, sé que el método de acción decorado solo se ejecutará si se supera la Autorización de autorización, pero no quiero acceder a la base de datos por segunda vez para volver a obtener el Grupo de revisión.

Estoy pensando en almacenar el Grupo de Revisión en HttpContext.Items["reviewGroup"] y acceder a esto desde el controlador en este momento.

¿Es esta una solución factible, o estoy en el camino equivocado?

Gracias!

Respuesta

1

El HttpContext.Items está activo solo mientras dure la solicitud. Si desea persistir durante un tiempo más largo, se debería poner en

a) Sesión - buena

b) Perfil - No veo la ventaja

c) cookies - no se recomienda

d) golpea la base de datos cada vez - debería estar bien

Almacenar en filterContext.RouteData.DataTokens?

+0

Bueno, no, no necesito el objeto ReviewGroup para más de una sola solicitud. Realmente, todo lo que necesito es pasar este objeto (obtenido en AuthorizeAttribute.OnAuthorization()) a ActionMethod(). –

0

A menos que esté haciendo una selección MUY grande de ReviewGroup o si tiene una base de datos enorme, entonces un segundo golpe de base de datos no sería un problema. Las bases de datos modernas son muy eficientes en la selección, especialmente con tablas correctamente indexadas.

En mi experiencia, esta es la mejor manera de hacer una autorización y un método similar a cómo autoricé acciones específicas en mis aplicaciones.

En resumen, no me preocuparía en absoluto acerca del segundo hit de la base de datos.

1

Alternativamente, una de las mejores maneras de evitar golpear la base de datos, y la más fácil, es el almacenamiento en caché. Recuperarlo, pegarlo en un caché. Si es necesario nuevamente, ya está en la memoria y no se requiere ningún golpe DB. De lo contrario, cuando el caché se salga del alcance, también lo hará el objeto.

Cuestiones relacionadas