72 votes

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

J’ai quelques tables possédant un uniqueidentifier UserID qui se rapporte à aspnet_Users.UserID. Lorsque l’utilisateur envoie des données de ces tables, étant donné que la méthode de contrôleur possède un [Authorize] j’obtiens un objet utilisateur. Je peux obtenir le nom d’utilisateur avec User.Identity.Name, mais comment puis-je obtenir l’ID d’utilisateur pour pouvoir établir la (la propriété) relation ?

86voto

Pablo Points 44881

Il semble que vous ne pouvez pas obtenir à partir l’objet utilisateur, mais vous pouvez l’obtenir de cette façon :

30voto

user3253009 Points 181

Voici la solution :

Incluent :

Puis utiliser les méthodes d’extension :

27voto

Pure.Krome Points 28473

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


Hmm. Je ne suis pas très sûr de savoir comment vous gérez vos utilisateurs dans votre système, mais il semble que vous à l'aide de la (très mal) asp.net membership provider qui sort de la boîte avec .net. C'est suggérée par le fait que vous avez dit

  • aspnet_Users.UserID
  • UserID est un type uniqueidentifier (lire: GUID).

Avec les formulaires par défaut le système d'authentification qui utilise la valeur par défaut FormsIdentity, il n'a qu'une seule propriété appelée Nom (comme vous l'avez justement noté). Cela signifie qu'il n'a qu'une valeur où placer certains d'utilisateur unique de l'information. Dans votre cas, à vous de mettre le Nom/nom d'utilisateur/nom d'Affichage, en Name de la propriété. Je suppose que ce nom est leur Nom d'Affichage et il est unique. Quelle que soit la valeur que vous mettez ici, il doit ÊTRE UNIQUE.

À partir de cela, vous pouvez vous saisir de l'utilisateur du guid.

Check this out.

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;

Donc, chaque fois que vous souhaitez saisir les informations de l'utilisateur, vous devez le saisir à partir de la base de données à l'aide de la méthode statique ci-dessus.

Lisez tous au sujet de l' Appartenance de classe et MembershipUser classe sur MSDN.

Bonus De Réponse / Suggestion

En tant que tel, je CACHE le résultat de sorte que vous n'avez pas besoin de continuer à appuyer sur la base de données.

... 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 Identité de classe (qui hérite de l'Identité) et d'ajouter des propriétés personnalisées, comme UserID. Ensuite, chaque fois que vous authentifier (et également à chaque demande), vous pouvez définir cette valeur. De toute façon, c'est un noyau dur de solution, alors allez avec la mise en cache, maintenant.

HTH

18voto

Simon_Weaver Points 31141

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

Il ne sait rien à propos de la liste des Identifiants utilisateur - qu'une abstraction de la notion d '"identité".

L' Identité de l'interface uniquement a 'Nom' pour un utilisateur, même pas de "nom d'utilisateur".

Si vous utilisez MVC4 avec la valeur par défaut SimpleMembershipProvider vous pouvez faire:

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

(Où WebSecurity est dans le package nuget Microsoft.AspNet.WebPages.WebData de WebMatrix

Vous pouvez également utiliser

WebSecurity.CurrentUserName
WebSecurity.CurrentUserId

(si vous utilisez ASPNetMembershipProvider qui est la plus sont plus complexes ASPNET système d'adhésion puis de voir la réponse de @eduncan911)

11voto

eduncan911 Points 5417

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

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

Anonyme ou non, etc.. Si un chèque d’est enregistré dans :

Donc, mettre tous ensemble :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X