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 ?
Réponses
Trop de publicités?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
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)