consume - web api en c#
¿Puedo acceder a IIdentity desde la API web? (4)
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.
En el controlador MVC o sus carpetas 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?
Puede intentar utilizar este método de extensión desde System.ServiceModel.dll:
public static IPrincipal GetUserPrincipal(this HttpRequestMessage request);
como:
IPrincipal principal = request.GetUserPrincipal();
IIdentity identity = principal.Identity;
Quitaron GetUserPrincipal en ASP.NET MVC 4 RC. Sin embargo, parece que el usuario de la propiedad ApiController ha reemplazado esto: http://msdn.microsoft.com/en-us/library/system.web.http.apicontroller.user
Sí tu puedes. ApiController
tiene una propiedad Request
de 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 de Properties
; encontrará que el valor de la clave MS_UserPrincipal
contiene su objeto IPrincipal
.
Al investigar esta respuesta, me encontré con System.Web.Http.HttpRequestMessageExtensions
que tiene un método de extensión GetUserPrincipal(this HttpRequestMessage request)
que accede a este valor del diccionario; No había visto este método de extensión antes y estaba accediendo a Request.Properties["MS_UserPrincipal"]
directamente, pero este podría ser un método mejor (menos dependiente del equipo ASP.NET Web Api manteniendo el mismo nombre de la clave). .)
Tuve el mismo problema y lo encontré de esta manera. En tu ApiController puedes usar
base.ControllerContext.RequestContext.Principal.Identity.;