2011-07-28 18 views
52

Uso de ASP.NET MVC Estoy creando un atributo Authorize personalizado para encargarse de alguna lógica de autorización personalizada. He analizado muchos ejemplos y es bastante directo, pero mi pregunta es ¿qué método es mejor anular, AuthorizeCore o OnAuthorization? He visto muchos ejemplos que anulan uno u otro. ¿Hay una diferencia?Extienda AuthorizeAttribute Omita AuthorizeCore o OnAuthorization

+1

descargar el código fuente en MVC4, http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/e0115a823029#src%2fSystem.Web.Mvc%2fAuthorizeAttribute.cs – user1736525

Respuesta

71

La idea es en los tipos de retorno:

AuthorizeCore devuelve un valor lógico - es hacer decisión código. Esto se debe limitar a mirar a la identidad y las pruebas del usuario y que los papeles están en etc, etc Básicamente se debe responder a la pregunta: ¿

Do I want this user to proceed?

No debe llevar a cabo cualquier actividad adicional "en el lado".

OnAuthorize vuelve inválido - aquí es donde pone funcionalidad que debe ocurrir en este momento. p.ej. Escribir en un registro, almacenar algunos datos en sesión, etc.

+1

Gracias por la información –

+14

Desafortunadamente AuthorizeCore no lo hace contener el AuthorizationContext que necesito (para acceder a RouteData y tomar decisiones basadas en él), por lo tanto, el único enfoque que veo es usar OnAuthorize. – gw0

+4

¿Por qué en la Tierra no está 'AuthorizationContext' pasado a' AuthorizeCore'? Esto parece ser un gran defecto. – Jez

15

Debe colocar cualquier código que se ejecute independientemente de si el usuario está siendo autorizado por primera vez, o si está utilizando una autorización en caché en AuthorizeCore.

Si mira el código fuente, puede ver que AuthorizeCore es llamado por OnAuthorize y OnCacheAuthorization. Esto permite que la autorización se guarde en la memoria caché, pero aún permite ciertas acciones y toma las decisiones reales sobre la autorización.

Si necesita algo de AuthorizationContext, puede crear una propiedad para contener la información y luego acceder a ella en el método AuthorizeCore.

+0

Desearía poder resaltar la última frase de su respuesta . Realmente deberías audaz. Refiriéndonos al comentario de @ gw0 en la respuesta aceptada, lo que es realmente desafortunado es que la sugerencia de usar la anulación incorrecta por el motivo equivocado fue votada. –

+3

La documentación de AuthorizeAttribute (MSDN) establece claramente (en Seguridad de subprocesos) _ "No se garantiza que ningún miembro de instancia sea seguro para subprocesos." _ Supongo que mantener información en una propiedad no es una opción. – bvgheluwe

+0

@BartVG - No estoy seguro de seguir. ¿Qué tiene que ver la seguridad de los hilos con esta discusión? Todo lo que el texto significa es que tiene que sincronizar el acceso a los objetos si se va a usar de múltiples hilos. –

Cuestiones relacionadas