2009-07-29 16 views
5

me gusta atributo ASP.Net MVC Autorizar, puedo ampliarlo y construir mi propia lógica y decorar mi controlador con él. PERO,Atributo personalizado escrito en C# ASP.Net MVC como Autorizar atributo

En mi arquitectura, que tienen una capa de servicio común (C# biblioteca de clases). El usuario final puede acceder a mi solicitud a través del sitio web ASP.Net MVC o por medio de mi capa de servicio web WCF REST expuesta. Mi asp.net MVC aplicación y la capa de servicio REST WCF tanto en el acceso a su vez mi capa de servicio común.

Deseo que se produzca la autorización en esta capa de servicio común y no en el controlador ASP.Net MVC ni en la capa de servicio REST expuesta.

¿Puedo crear un atributo ASP.Net MVC Authorize como para decorar mis métodos en la biblioteca común de clases C#? Este atributo tomará parámetros y decidirá si el usuario actual tiene acceso para realizar esa función o no.

, gracias & Saludos, Ajay

Respuesta

5

Lo que está buscando se puede lograr utilizando la biblioteca AOP, como PostSharp (http://www.postsharp.org/). Es más complejo que utilizar el atributo Authorize en mvc, pero es bastante simple.

+0

muchas gracias. Postharp se ve bien. Estoy investigando en este momento. Espero que mi arquitectura tenga un buen impulso. – Ajay

1

No, AuthorizeAttribute funciona porque el marco MVC invoca explícitamente antes de llamar al método. Una característica similar para su capa de servicio solo funcionaría si sus clientes también la invocaron explícitamente. No sería razonable suponer que incluso un cliente bien intencionado siempre recordaría a buscar el atributo e invocarlo. WCF has its own security. Debe usar eso en lugar de escribir el suyo.

+0

Si pongo la lógica de autorización en mis API REST, también tendré que duplicarla en los controladores. Es por eso que necesito hacer algo que está en la capa de servicio (no WCF, solo la biblioteca de clases C#) – Ajay

+0

No tiene que duplicar nada. WCF y ASP.NET le dirán * quién * está conectado. Simplemente tiene que traducir esto en * qué * pueden hacer. Este código podría ser compartido. Simplemente no deberías hacerlo con un atributo personalizado es todo lo que digo. Use lo que ya está incorporado en los marcos. –

+0

¿Qué pasa si él decide agregar otra interfaz? Tendría que escribir todos esos atributos una vez más. ¿Qué sucede si cambia algunas reglas, como qué grupos pueden llamar a un método? Tendría que cambiar todos sus frentes. Hay posibilidad de crear un atributo tal (con AOP), y creo que Ajay debería hacerlo, porque sólo de esa manera se puede garantizar que la autorización es consistente para todos los fronteds y que puede agregar con seguridad cualquier otro frontal y no hacer se preocupan por todas las cosas de autorización que son comunes a todos los frentes ... – maciejkow

0

Esto no debería ser demasiado difícil de hacer - hay un par de lugares que usted podría reflejar a cabo el atributo y manejarlo en consecuencia:

  • al iniciar la aplicación en Global.asx puede personalizar el enrutamiento y ubicaciones para las vistas

  • subyacentes eventos solicitud ASP.NET todavía disparar, por lo que podría invalidar uno de ellos

  • Crear su propio controlador de base y anular OnActionExecuting


actualización siguiente comentario

Ahh, ya veo. En ese caso, si usted está haciendo llamadas directas a continuación, que debe salir Code Access Security, que creo que cubre lo que quiere decir.

Como alternativa, un atributo personalizado podría tener sentido siempre que use algún tipo de patrón de fábrica; luego, la llamada de reflexión que obtiene la fábrica podría verificar los atributos.

Si no está usando el reflejo para recuperar sus clases o llamar a sus métodos (que es esencialmente lo que hace el enrutamiento en MVC), entonces no tendrá la oportunidad de verificar sus atributos.

+1

en ASP.Net MVC puedo hacer esto, tengo que hacer lo mismo en la biblioteca de clases C#, por lo que cualquiera que está llamando C# método, se debe hacer la comprobación de autorización. Gracias. – Ajay

2

Otra forma de manejar esto es usar el atributo [PrincipalPermission] en su capa de servicio. Esto puede evitar que las personas que llaman ejecuten un método (o accedan a una clase completa) sin la autorización definida.

Cuestiones relacionadas