varias solicitud solicitado recurso que ningún net método mvc encontraron encontrado con coincidían coinciden coincida asp admite acciones c# asp.net asp.net-web-api asp.net-identity

c# - solicitud - Obtenga el usuario actual, dentro de una acción ApiController, sin pasar el ID de usuario como parámetro



se encontraron varias acciones que coincidían con la solicitud post (8)

¿Cómo obtenemos al usuario actual, dentro de una acción ApiController segura, sin pasar el userName o userId como parámetro?

Suponemos que esto está disponible, porque estamos dentro de una acción segura. Estar en una acción segura significa que el usuario ya se ha autenticado y la solicitud tiene su token de portador. Dado que WebApi ha autorizado al usuario, puede haber una forma integrada de acceder al userId, sin tener que pasarlo como un parámetro de acción.


En .Net Core use User.Identity.Name para obtener el reclamo de nombre del usuario.


La pista yace en el controlador de cuenta autogenerado Webapi2

Tener esta propiedad con getter definido como

public string UserIdentity { get { var user = UserManager.FindByName(User.Identity.Name); return user;//user.Email } }

y para obtener UserManager - En WebApi2 -do como Romans (leer como AccountController) hacer

public ApplicationUserManager UserManager { get { return HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>(); } }

Esto debería ser compatible en IIS y el modo de host auto


La respuesta de Karan Bhandari es buena, pero el AccountController agregado en un proyecto es muy probable que sea un Mvc.Controller . Para convertir su respuesta para su uso en un ApiController, cambie HttpContext.Current.GetOwinContext() a Request.GetOwinContext() y asegúrese de haber agregado las siguientes 2 instrucciones de using :

using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.Owin;


Ninguna de las sugerencias anteriores funcionó para mí. ¡Lo siguiente hizo!

HttpContext.Current.Request.LogonUserIdentity.Name

Supongo que hay una gran variedad de escenarios y este funcionó para mí. Mi escenario involucraba un frontend AngularJS y una aplicación back-end Web API 2, ambos ejecutados bajo IIS. Tuve que configurar ambas aplicaciones para que se ejecutaran exclusivamente con la Autenticación de Windows.

No es necesario pasar ninguna información del usuario. El navegador e IIS intercambian las credenciales del usuario conectado y la API web tiene acceso a las credenciales del usuario bajo demanda (desde IIS supongo).


Si está utilizando Asp.Identity UseManager, establece automáticamente el valor de

RequestContext.Principal.Identity.GetUserId ()

basado en IdentityUser que usas al crear IdentityDbContext .

Si alguna vez está implementando una tabla de usuario personalizada y una autenticación de portador de tokens owken, compruebe amablemente mi respuesta.

¿Cómo obtener el contexto del usuario durante las llamadas a la API web?

Espero que todavía ayude :)


También puede acceder al principal utilizando la propiedad del User en ApiController .

Entonces las siguientes dos declaraciones son básicamente las mismas:

string id; id = User.Identity.GetUserId(); id = RequestContext.Principal.Identity.GetUserId();


En WebApi 2 puede usar RequestContext.Principal desde dentro de un método en ApiController


string userName; string userId; if (HttpContext.Current != null && HttpContext.Current.User != null && HttpContext.Current.User.Identity.Name != null) { userName = HttpContext.Current.User.Identity.Name; userId = HttpContext.Current.User.Identity.GetUserId(); }

O, según el comentario de Darrel Miller, tal vez use esto para recuperar el HttpContext primero.

// get httpContext object httpContext; actionContext.Request.Properties.TryGetValue("MS_HttpContext", out httpContext);

Ver también:

Cómo acceder a HTTPContext desde dentro de su acción de API web