2011-07-12 19 views
14

He creado un AuthorizeAttribute personalizado que verifica algunas credenciales de OAuth que se envían dentro del encabezado HTTP. Estoy usando algunas de estas credenciales para identificar quién hace la solicitud. Una vez que analizo esta información en AuthorizeAttribute, ¿hay alguna forma de pasarla para que los datos puedan asignarse a una variable de instancia del Controlador? Luego, en cualquier lugar de mi Controlador, tendré el ID de la parte solicitante.¿Cómo puedo pasar datos de un AuthorizeAttribute al controlador?

Respuesta

12

Respuesta original

Usted debe ser capaz de hacer esto en su filtro

filterContext.HttpContext.Items["test"] = "foo"; 

Y entonces este en su acción

_yourVariable = HttpContext.Items["test"]; 

Usted probablemente querrá use una clave más única que "test", pero esa es la idea.

EDITAR Hay dos razones por las que hacemos esto en la acción más que el constructor:

  1. A Controller's constructor fires before OnAuthorization, por lo que aún no se establecerá el artículo.
  2. El HttpContext aún no está configurado en el constructor del Controlador.

solución alternativa

  1. Crear un nuevo OAuthController : Controller
  2. Override OnAuthorization
  3. Mover la lógica de su filtro en OAuthController.OnAuthorization
  4. establecer un campo protected (es decir, protected object myAuthData) en OAuthController
  5. Haga que sus otros controladores hereden de OAuthController en lugar de Controller
  6. Sus otros controladores pueden tener acceso a myAuthData.
+0

Hmm ... cuando agregué un Constructor a mi Controlador para configurar esta variable, rompió todo mi Enlace de Modelo (arroja un error). ¿Alguna otra idea? – BigOmega

+0

@Ryan Originalmente tuve esto anotado en mi respuesta, pero lo eliminé. Tal vez debería volver a instalarlo. De todos modos, el constructor de un Controlador dispara ** antes ** de Autorización Activada, por lo que el elemento no se configurará todavía. Además, el Controlador ni siquiera tiene un HttpContext aún en ese punto. Necesitas hacer esto en tu Acción. –

+0

@Ryan Una alternativa sería crear 'OAuthController: Controller', anular' OnAuthorization' como se menciona en la publicación a la que se vinculó, establecerlo como miembro 'protected' y hacer que sus otros controladores hereden de él. –

Cuestiones relacionadas