¿Cómo se obtiene el ID de usuario de un objeto Usuario en ASP.Net MVC?

Tengo algunas tablas que tienen un identificador de usuario uniqueidentifier que se relaciona con aspnet_Users.UserID. Cuando el usuario envía algunos datos para esas tablas, dado que el método del controlador tiene un [Autorizar], obtengo un objeto Usuario. Puedo obtener el nombre de usuario con User.Identity.Name, pero ¿cómo obtengo que el UserID pueda establecer (la propiedad) la relación?

Parece que no puede obtenerlo del objeto Usuario, pero puede obtenerlo de esta manera:

Guid userGuid = (Guid)Membership.GetUser().ProviderUserKey; 

Aquí está la solución:

Incluir:

 using Microsoft.AspNet.Identity; 

Luego usa los métodos de extensión:

 User.Identity.GetUserId(); 

En primer lugar, esta respuesta no es estrictamente una respuesta MVC, sino una respuesta ASP.NET. El hecho de que su sitio sea MVC es irrelevante para resolver el problema, en este caso.


Hmm. No estoy muy seguro de cómo maneja a los usuarios en su sistema, pero parece que usa el (muy malvado) asp.net membership provider que sale de la caja con .net. Esto está insinuado por el hecho de que dijiste

  • aspnet_Users.UserID
  • ID de usuario es un identificador único (leer: GUID).

Con el sistema de autenticación de formularios predeterminado, que usa FormsIdentity por defecto, solo tiene una sola propiedad llamada Nombre (como se señaló correctamente). Esto significa que tiene solo un valor donde colocar alguna información de usuario única. En su caso, está poniendo Name / UserName / DisplayName , en la propiedad Name . Asumo que este nombre es su nombre para mostrar y es único. Cualquier valor que pongas aquí, TIENE QUE SER ÚNICO .

A partir de esto, puede tomar el guid del usuario.

Mira esto.

 using System.Web.Security; .... // NOTE: This is a static method .. which makes things easier to use. MembershipUser user = Membership.GetUser(User.Identity.Name); if (user == null) { throw new InvalidOperationException("User [" + User.Identity.Name + " ] not found."); } // Do whatever u want with the unique identifier. Guid guid = (Guid)user.ProviderUserKey; 

Por lo tanto, cada vez que desee obtener la información del usuario, debe obtenerla de la base de datos utilizando el método estático anterior.

Lea todo sobre la clase de Membresía y la clase MembershipUser en MSDN.

Respuesta de bonificación / sugerencia

Como tal, me gustaría CACHE ese resultado para que no tenga que seguir golpeando la base de datos.

 ... cont from above.... Guid guid = (Guid)user.ProviderUserKey; Cache.Add(User.Identity.Name, user.UserID); // Key: Username; Value: Guid. 

De lo contrario, puede crear su propia clase de Identidad (que hereda de IIdentity ) y agregar sus propias propiedades personalizadas, como ID de usuario . Luego, cada vez que se autentique (y también en cada solicitud) puede establecer este valor. De todos modos, esta es una solución de núcleo duro, así que ve con el almacenamiento en caché, en este momento.

HTH

User.Identity es un IPrincipal , generalmente de tipo System.Web.Security.FormsIdentity

No sabe nada sobre UserIDs, es solo una abstracción del concepto de ‘identidad’.

La interfaz de IIdentity solo tiene ‘Nombre’ para un usuario, ni siquiera ‘Nombre de usuario’.

Si está utilizando MVC4 con el SimpleMembershipProvider predeterminado, puede hacer esto:

 WebSecurity.GetUserId(User.Identity.Name) // User is on ControllerBase 

(Donde WebSecurity está en el paquete nuget Microsoft.AspNet.WebPages.WebData en WebMatrix

También puedes usar

 WebSecurity.CurrentUserName WebSecurity.CurrentUserId 

(Si usa ASPNetMembershipProvider, que es el sistema de membresía ASPNET más antiguo y complejo, vea la respuesta de @educcan911)

Si está utilizando la Membresía ASP.NET (que a su vez usa el objeto IPrincipal):

 using System.Web.Security; { MembershipUser user = Membership.GetUser(HttpContext.User.Identity.Name); Guid guid = (Guid)user.ProviderUserKey; } 

User.Identity siempre devuelve el estado del usuario actual, conectado o no.

Anónimo o no, etc. Por lo tanto, se inicia sesión en un registro:

 if (User.Identity.IsAuthenticated) { ... } 

Entonces, poniéndolo todo junto:

 using System.Web.Security; { if (User.Identity.IsAuthenticated) { MembershipUser user = Membership.GetUser(HttpContext.User.Identity.Name); Guid guid = (Guid)user.ProviderUserKey; } } 

La mejor opción para obtener ID de usuario

Agregar referencias debajo

 using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.EntityFramework; using Microsoft.Owin.Security;* public myFunc() { ..... // Code which will give you user ID is var tmp = User.Identity.GetUserId(); } 

Si está utilizando su propio objeto IPrincipal para la autorización, solo necesita lanzarlo para acceder al Id.

Por ejemplo:

 public class MyCustomUser : IPrincipal { public int UserId {get;set;} //...Other IPrincipal stuff } 

Aquí hay un gran tutorial sobre cómo crear su propia autenticación basada en formularios.

http://www.codeproject.com/KB/web-security/AspNetCustomAuth.aspx

Eso debería llevarlo por el camino correcto para crear una cookie de autenticación para su usuario y acceder a sus datos de usuario personalizados.

 using System.Web.Security; MembershipUser user = Membership.GetUser(User.Identity.Name); int id = Convert.ToInt32(user.ProviderUserKey); 

Es la propiedad ProviderUserKey.

 System.Web.Security.MembershipUser u; u.ProviderUserKey 

Sencillo….

 int userID = WebSecurity.CurrentUserId; 

Por lo general, puede usar WebSecurity.currentUserId , pero si está en AccountController justo después de que se haya creado la cuenta y desea usar el ID de usuario para vincular al usuario con algunos datos en otras tablas, entonces WebSecurity.currentUserId (y todos los soluciones anteriores), lamentablemente, en ese caso devuelve -1, por lo que no funciona.

Afortunadamente, en este caso tiene a mano el contexto de base de datos para la tabla UserProfiles, de modo que puede obtener el ID de usuario de la siguiente manera:

 UserProfile profile = db.UserProfiles.Where( u => u.UserName.Equals(model.UserName) ).SingleOrDefault(); 

Me encontré con este caso recientemente y esta respuesta me habría ahorrado un montón de tiempo, así que simplemente lo di a conocer.