Comment obtenez-vous l’ID utilisateur d’un object utilisateur dans ASP.Net MVC?

J’ai des tables qui ont un identifiant unique identifiant utilisateur qui se rapporte à aspnet_Users.UserID. Lorsque l’utilisateur soumet des données pour ces tables, la méthode du contrôleur ayant un [Authorize], j’obtiens un object User. Je peux obtenir le nom d’utilisateur avec User.Identity.Name, mais comment puis-je que l’ID utilisateur soit capable d’établir la relation (de propriété)?

Il semble que vous ne puissiez pas l’obtenir de l’object User mais vous pouvez l’obtenir de cette façon:

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

Voici la solution:

Comprendre:

 using Microsoft.AspNet.Identity; 

Utilisez ensuite les méthodes d’extension:

 User.Identity.GetUserId(); 

Tout d’abord, cette réponse n’est pas ssortingctement une réponse MVC, mais une réponse ASP.NET. Le fait que votre site soit MVC n’est pas pertinent pour résoudre le problème, dans ce cas.


Hmm. Je ne sais pas trop comment vous traitez vos utilisateurs dans votre système, mais cela ressemble à vous d’utiliser le asp.net membership provider (très mal) d’ asp.net membership provider qui sort de la boîte avec .net. Ceci est suggéré par le fait que vous avez dit

  • aspnet_Users.UserID
  • UserID est un identifiant unique (lire: GUID).

Avec le système d’authentification par formulaire par défaut, qui utilise la valeur par défaut de FormsIdentity , il ne possède qu’une seule propriété appelée Nom (comme vous l’avez noté correctement). Cela signifie qu’il n’a qu’une seule valeur pour placer des informations utilisateur uniques. Dans votre cas, vous inscrivez Nom / Nom d’utilisateur / Nom d’affichage dans la propriété Name . Je suppose que ce nom est leur nom d’affichage et qu’il est unique. Quelle que soit la valeur que vous mettez ici, il doit être unique .

De cela, vous pouvez récupérer le guide utilisateur.

Regarde ça.

 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; 

Ainsi, chaque fois que vous souhaitez récupérer les informations utilisateur, vous devez les récupérer dans la firebase database en utilisant la méthode statique ci-dessus.

Lisez tout sur la classe Membership et la classe MembershipUser sur MSDN.

Réponse / Suggestion Bonus

En tant que tel, je CACHE ce résultat, donc vous n’avez pas besoin de continuer à bash la firebase database.

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

Sinon, vous pouvez créer votre propre classe Identity (qui hérite de IIdentity ) et append vos propres propriétés personnalisées, comme UserID . Ensuite, chaque fois que vous vous authentifiez (et également sur chaque requête), vous pouvez définir cette valeur. Quoi qu’il en soit, c’est une solution de kernel dur, alors allez-y avec la mise en cache.

HTH

User.Identity est un IPrincipal – généralement de type System.Web.Security.FormsIdentity

Il ne sait rien sur les identifiants d’utilisateur – c’est juste une abstraction du concept d’une «identité».

L’interface IIdentity a uniquement le nom de l’utilisateur, pas même celui de l’utilisateur.

Si vous utilisez MVC4 avec le SimpleMembershipProvider par défaut, vous pouvez le faire:

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

(Où WebSecurity trouve dans le package nuget Microsoft.AspNet.WebPages.WebData dans WebMasortingx

Vous pouvez aussi utiliser

 WebSecurity.CurrentUserName WebSecurity.CurrentUserId 

(si vous utilisez ASPNetMembershipProvider qui est l’ancien système d’adhésion ASPNET plus complexe, consultez la réponse de @ eduncan911)

Si vous utilisez l’appartenance ASP.NET (qui à son tour utilise l’object IPrincipal):

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

User.Identity renvoie toujours l’état de l’utilisateur actuel, connecté ou non.

Anonyme ou pas, etc. Donc, un chèque est connecté:

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

Donc, mettre tout ça ensemble:

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

Meilleure option pour obtenir un ID utilisateur

Ajouter les références ci-dessous

 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 vous utilisez votre propre object IPrincipal pour autorisation, il vous suffit de le lancer pour accéder à l’ID.

Par exemple:

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

Voici un excellent tutoriel sur la création de votre propre authentification par formulaire.

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

Cela devrait vous permettre de créer un cookie d’authentification pour votre utilisateur et d’accéder à vos données utilisateur personnalisées.

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

C’est la propriété ProviderUserKey.

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

Simple….

 int userID = WebSecurity.CurrentUserId; 

Généralement, vous pouvez simplement utiliser WebSecurity.currentUserId , mais si vous êtes dans AccountController juste après la création du compte et que vous souhaitez utiliser l’ID utilisateur pour associer l’utilisateur à certaines données d’autres tables, WebSecurity.currentUserId (et tous les solutions ci-dessus), malheureusement, dans ce cas retourne -1, donc ça ne marche pas.

Heureusement, dans ce cas, vous disposez du contexte db pour la table UserProfiles, vous pouvez donc obtenir l’ID utilisateur suivant:

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

Je suis tombé sur ce cas récemment et cette réponse m’aurait permis de gagner beaucoup de temps.