Ich habe einige Tabellen mit einer eindeutigen ID UserID, die sich auf aspnet_Users.UserID bezieht. Wenn der Benutzer einige Daten für diese Tabellen übermittelt, erhalte ich ein Benutzerobjekt, da die Controller-Methode über [Authorize] verfügt. Ich kann den Benutzernamen mit User.Identity.Name abrufen, aber wie erhalte ich die UserID, um eine (Eigentums-) Beziehung herstellen zu können?
asp.net
membership
pupeno
quelle
quelle
Antworten:
Es scheint, dass Sie es nicht vom Benutzerobjekt abrufen können, aber Sie können es folgendermaßen abrufen:
quelle
Hier ist die Lösung:
Einschließen:
using Microsoft.AspNet.Identity;
Verwenden Sie dann Erweiterungsmethoden:
User.Identity.GetUserId();
quelle
Erstens ist diese Antwort keine reine MVC-Antwort, sondern eine ASP.NET-Antwort. Die Tatsache, dass Ihre Site MVC ist, spielt in diesem Fall für die Lösung des Problems keine Rolle.
Hmm. Ich bin mir nicht sicher, wie Sie mit Ihren Benutzern in Ihrem System umgehen, aber es hört sich so an, als würden Sie das (sehr böse) verwenden
asp.net membership provider
, das mit .net aus der Box kommt. Dies wird durch die Tatsache angedeutet, dass Sie gesagt habenMit dem Standardformularauthentifizierungssystem, das die StandardformsIdentity verwendet , verfügt es nur über eine einzige Eigenschaft namens Name (wie Sie richtig angegeben haben). Dies bedeutet, dass es nur einen Wert gibt, in dem eindeutige Benutzerinformationen abgelegt werden können. In Ihrem Fall fügen Sie Name / Benutzername / Anzeigename in die
Name
Eigenschaft ein. Ich gehe davon aus, dass dieser Name ihr Anzeigename ist und eindeutig ist. Welchen Wert Sie auch hier einsetzen, es muss einzigartig sein .Daraus können Sie die Anleitung des Benutzers abrufen.
Überprüfen Sie dies heraus.
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;
Jedes Mal, wenn Sie die Benutzerinformationen abrufen möchten, müssen Sie sie mit der oben beschriebenen statischen Methode aus der Datenbank abrufen.
Lesen Sie alles über die Membership-Klasse und die MembershipUser-Klasse auf MSDN.
Bonus Antwort / Vorschlag
Als solches würde ich dieses Ergebnis CACHEN, damit Sie nicht weiter auf die Datenbank zugreifen müssen.
... cont from above.... Guid guid = (Guid)user.ProviderUserKey; Cache.Add(User.Identity.Name, user.UserID); // Key: Username; Value: Guid.
Andernfalls können Sie Ihre eigene Identitätsklasse erstellen (die von IIdentity erbt ) und Ihre eigenen benutzerdefinierten Eigenschaften hinzufügen, z
UserID
. Bei jeder Authentifizierung (und auch bei jeder Anforderung) können Sie diesen Wert festlegen. Wie auch immer, dies ist eine Hardcore-Lösung. Fahren Sie jetzt mit dem Caching fort.HTH
quelle
User.Identity
ist einIPrincipal
- typischer TypSystem.Web.Security.FormsIdentity
Es weiß nichts über UserIDs - es ist nur eine Abstraktion des Konzepts einer 'Identität'.
Die IIdentity- Oberfläche hat nur 'Name' für einen Benutzer, nicht einmal 'Benutzername'.
Wenn Sie MVC4 mit der Standardeinstellung verwenden
SimpleMembershipProvider
, können Sie Folgendes tun:WebSecurity.GetUserId(User.Identity.Name) // User is on ControllerBase
(Wo
WebSecurity
befindet sich im Nuget-PaketMicrosoft.AspNet.WebPages.WebData
in WebMatrix ?Sie können auch verwenden
WebSecurity.CurrentUserName WebSecurity.CurrentUserId
(Wenn Sie ASPNetMembershipProvider verwenden , das ältere, komplexere ASPNET-Mitgliedschaftssystem, lesen Sie die Antwort von @ eduncan911.)
quelle
WebSecurity.CurrentUserId
. Sogar der AccountController mit Vorlagen verwendet,WebSecurity.GetUserId(User.Identity.Name)
was ein wenig dumm erscheint, wenn erCurrentUserId
verfügbar ist.Wenn Sie die ASP.NET-Mitgliedschaft verwenden (die wiederum das IPrincipal-Objekt verwendet):
User.Identity gibt immer den Status des aktuellen Benutzers zurück, der angemeldet ist oder nicht.
Anonym oder nicht usw. Ein Check für ist also angemeldet:
if (User.Identity.IsAuthenticated) { ... }
Also, alles zusammen:
quelle
Beste Option zum Abrufen der Benutzer-ID
Fügen Sie unten Referenzen hinzu
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(); }
quelle
Wenn Sie Ihr eigenes IPrincipal-Objekt für die Autorisierung verwenden, müssen Sie es nur umwandeln, um auf die ID zuzugreifen.
Zum Beispiel:
public class MyCustomUser : IPrincipal { public int UserId {get;set;} //...Other IPrincipal stuff }
Hier finden Sie ein großartiges Tutorial zum Erstellen Ihrer eigenen formularbasierten Authentifizierung.
http://www.codeproject.com/KB/web-security/AspNetCustomAuth.aspx
Damit sollten Sie auf dem richtigen Weg sein, ein Authentifizierungscookie für Ihren Benutzer zu erstellen und auf Ihre benutzerdefinierten Benutzerdaten zuzugreifen.
quelle
using System.Web.Security; MembershipUser user = Membership.GetUser(User.Identity.Name); int id = Convert.ToInt32(user.ProviderUserKey);
quelle
Es ist die ProviderUserKey-Eigenschaft.
System.Web.Security.MembershipUser u; u.ProviderUserKey
quelle
Einfach....
int userID = WebSecurity.CurrentUserId;
quelle
Normalerweise können Sie nur verwenden
WebSecurity.currentUserId
, aber wenn Sie sich in AccountController befinden, kurz nachdem das Konto erstellt wurde, und Sie die Benutzer-ID verwenden möchten, um den Benutzer mit einigen Daten in anderen Tabellen zu verknüpfen, dannWebSecurity.currentUserId
(und allen oben genannten Lösungen), leider In diesem Fall wird -1 zurückgegeben, sodass dies nicht funktioniert.Glücklicherweise haben Sie in diesem Fall den Datenbankkontext für die UserProfiles-Tabelle zur Hand, sodass Sie die Benutzer-ID folgendermaßen abrufen können:
UserProfile profile = db.UserProfiles.Where( u => u.UserName.Equals(model.UserName) ).SingleOrDefault();
Ich bin kürzlich auf diesen Fall gestoßen, und diese Antwort hätte mir eine ganze Menge Zeit gespart.
quelle