2012-03-19 20 views
48

Estoy agregando algunos servicios de API web a una aplicación MVC existente. Tengo una carpeta modelo para mis controladores MVC para obtener el objeto de usuario almacenado en CustomIdentity. Estoy intentando reproducir esto para mis acciones de API web.¿Puedo acceder a IIdentity desde la API web?

En el controlador MVC o sus aglutinantes puedo usar

controllerContext.HttpContext.User.Identity 

El ApiController no tiene el objeto HttpContext. ¿Hay alguna forma de acceder al objeto IIdentity desde la API web?

Respuesta

72

Ellos eliminado GetUserPrincipal en ASP.NET MVC 4 RC. Sin embargo, parece la propiedad ApiController usuario ha sustituido a esto: http://msdn.microsoft.com/en-us/library/system.web.http.apicontroller.user

+0

¿Pero cómo accede al usuario (que es una propiedad del controlador) en su método 'IsAuthorized'? – Maverick

+0

Si se refiere al método 'AuthorizationAttribute.IsAuthorized', puede usar' principal.Identity'. – mhu

+0

... ¿y de dónde obtendría 'principal'? – Maverick

30

Sí, puedes. ApiController tiene una propiedad Request del tipo System.Net.Http.HttpRequestMessage; esto contiene detalles sobre la solicitud actual de forma natural (también tiene un colocador para fines de pruebas unitarias). HttpRequestMessage tiene un diccionario Properties; encontrará que el valor de la clave MS_UserPrincipal contiene su objeto IPrincipal.

Al investigar esta respuesta, encontré el System.Web.Http.HttpRequestMessageExtensions que tiene un método de extensión GetUserPrincipal(this HttpRequestMessage request) que accede a este valor de diccionario; No había visto este método de extensión antes y estaba accediendo directamente al Request.Properties["MS_UserPrincipal"], pero este podría ser un método mejor (menos dependiente del equipo ASP.NET Web Api manteniendo el nombre de la clave igual ...)

+0

Gracias por esto. GetUserPrincipal funciona. – Magpie

+0

¡Gracias! Probablemente hubiera perdido mucho tiempo buscando este método de extensión bastante oscuro en el navegador de objetos. –

+1

Ya no funciona –

3

Usted puede tratar de utilizar este extension method de System.ServiceModel.dll:

public static IPrincipal GetUserPrincipal(this HttpRequestMessage request); 

como:

IPrincipal principal = request.GetUserPrincipal(); 
IIdentity identity = principal.Identity; 
2

que tenía el mismo problema y lo encontré de esta manera. En su ApiController puede usar
base.ControllerContext.RequestContext.Principal.Identity.;

Cuestiones relacionadas