Cómo se obtiene el userId de un objeto User en ASP.Net ¿MVC?


Tengo algunas tablas que tienen un ID de usuario uniqueidentifier que se relaciona con aspnet_Users.userId. Cuando el usuario envía algunos datos para esas tablas, ya que el método controller tiene un [Authorize] obtengo un objeto User. Puedo obtener el nombre de usuario con User.Identity.Name, pero ¿cómo consigo que el userId sea capaz de establecer (la propiedad) la relación?

Author: Kris, 2009-05-29

11 answers

Parece que no puedes obtenerlo del objeto User, pero puedes obtenerlo de esta manera:

Guid userGuid = (Guid)Membership.GetUser().ProviderUserKey;
 86
Author: pupeno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-29 19:58:07

Aquí está la solución:

Incluye:

using Microsoft.AspNet.Identity;

Luego use métodos de extensión:

User.Identity.GetUserId();
 30
Author: faisale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-30 12:55:56

En primer lugar, esta respuesta no es estrictamente una respuesta MVC, sino una ASP.NET contesta. 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 está manejando a sus usuarios en su sistema, pero suena como si estuviera usando el (muy malvado) asp.net membership provider que sale de la caja con. net. Esto se insinúa por el hecho de que dijo

  • aspnet_Users.userId
  • userId es un uniqueidentifier (léase: GUID).

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

De esto, usted puede agarrar 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 Membershipy la clase MembershipUser en MSDN.

Respuesta / Sugerencia adicional

Como tal, almacenaría ese resultado en CACHÉ 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 propio Identity class (que hereda de IIdentity) y añade tus propias propiedades personalizadas, como UserID. 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 ir con el almacenamiento en caché, ahora mismo.

HTH

 27
Author: Pure.Krome,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-23 13:20:05

User.Identity es un IPrincipal - típicamente de tipo System.Web.Security.FormsIdentity

No sabe nada sobre userIds - es solo una abstracción del concepto de una 'identidad'.

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

Si está utilizando MVC4 con el valor predeterminado SimpleMembershipProvider puedes 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 estás usando ASPNetMembershipProvider que es el sistema de membresía de ASPNET más antiguo y complejo, vea la respuesta de @eduncan911)

 18
Author: Simon_Weaver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-13 21:39:18

Si está utilizando el ASP.NET Membresía (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;
}

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

Anónimo o no, etc. Así que un cheque para está conectado:

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

Así que, 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;
  }
}
 11
Author: eduncan911,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-29 20:08:04

La Mejor Opción para obtener ID de Usuario

Añadir referencias a continuación

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();

}
 6
Author: user3175805,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-09 02:39:30

Si está utilizando su propio objeto IPrincipal para la autorización, solo necesita enviarlo 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

Esto le llevará por el camino correcto para crear una cookie de autenticación para su usuario y acceder a sus datos de usuario personalizados.

 3
Author: ebrown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-29 14:39:01
using System.Web.Security;

MembershipUser user = Membership.GetUser(User.Identity.Name); 
int id = Convert.ToInt32(user.ProviderUserKey);
 2
Author: user3361768,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-28 05:21:55

Es la propiedad ProviderUserKey.

System.Web.Security.MembershipUser u;
u.ProviderUserKey
 1
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-29 07:17:26

Simple....

int userID = WebSecurity.CurrentUserId;
 1
Author: Izztraab,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-05 10:00:04

Normalmente solo puedes usar WebSecurity.currentUserId, pero si estás en AccountController justo después de que la cuenta haya sido creada y quieres usar el id de usuario para vincular al usuario a algunos datos en otras tablas entonces WebSecurity.currentUserId (y todas las soluciones anteriores), desafortunadamente, en ese caso devuelve -1, por lo que no funciona.

Por suerte en este caso tiene a mano el contexto de la base de datos para la tabla de UserProfiles, por lo 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 sólo lo puso por ahí.

 0
Author: www.debug.coach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-15 10:55:25