Wie erhält man die Benutzer-ID eines Benutzerobjekts in ASP.Net MVC?

72

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?

pupeno
quelle
1
die frage hat eigentlich nichts mit mvc zu tun, also bin ich von asp-net-mvc zu asp-net zurückgekehrt, um das bessere publikum dazu zu bringen, sich das anzuschauen.
Kris
Kris, ASP.Net MVC bietet ein Benutzerobjekt, das ASP.Net meines Erachtens nicht bietet. Liege ich falsch?
Pupeno
2
Ja, du liegst falsch. Kris hat recht. Es ist eine ASP.NET-Sache, nicht nur ASP.NET MVC.
Pure.Krome

Antworten:

86

Es scheint, dass Sie es nicht vom Benutzerobjekt abrufen können, aber Sie können es folgendermaßen abrufen:

Guid userGuid = (Guid)Membership.GetUser().ProviderUserKey;
pupeno
quelle
"Ja wirklich?" es erfordert keine Zeichenfolge? / me prüft msdn: msdn.microsoft.com/en-us/library/… . Sh | t! Du hast recht! guter Fund :)
Pure.Krome
16
In dem eingeführten OAuth-Material funktioniert dies nicht (null zurückgegeben). In ASP.Net 4 MVC können Sie die WebSecurity.CurrentUserId-Eigenschaft verwenden
Dan
2
@Dann Es scheint, dass dies in ASP.Net MVC 5 nicht mehr funktioniert, oder sie haben die using-Anweisungen geändert (sie haben System.Web.Security verwendet). Irgendwelche Ideen?
Jed Grant
9
MVC 5 Lösung: stackoverflow.com/questions/18448637/…
Adam Szabo
30

Hier ist die Lösung:

Einschließen:

using Microsoft.AspNet.Identity;

Verwenden Sie dann Erweiterungsmethoden:

User.Identity.GetUserId();
faisale
quelle
27

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 haben

  • aspnet_Users.UserID
  • UserID ist eine eindeutige Kennung (sprich: GUID).

Mit 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 NameEigenschaft 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

Pure.Krome
quelle
1
Ist das der Weg, es zu tun? Den Namen des Benutzers eindeutig machen? Wofür haben wir dann überhaupt Ausweise?
Pupeno
4
OT: Warum behaupten Sie, die ASP.NET-Mitgliedschaft sei böse?
eduncan911
5
@Eric: weil ich persönlich der Meinung bin, dass es für die meisten Szenarien eine massiv überentwickelte Lösung ist. Wie oft sehen Sie beispielsweise eine Lösung, die einen gemeinsamen SQL-Server gemeinsam nutzt, auf dem die Benutzer datenbankübergreifend auf demselben SQL-Server gemeinsam genutzt werden? All diese Tabellen und gespeicherten Prozesse, die für die meisten Leute des Szenarios auf nur ein oder zwei reduziert werden können. Zusammenfassung: massives Aufblähen. Übermotorisiert. Randnotiz: OpenID FTW jetzt :)
Pure.Krome
@J. Pablo: kein Kumpel. Die ID ist die Hauptsache, die eindeutig ist, aber der Membership.GetUser (Zeichenfolge) ermittelt den Benutzer anhand der angegebenen Zeichenfolge -> im Allgemeinen seines Benutzernamens. Wenn Sie diese Zeichenfolge nicht angeben, wird der aktuelle Wert für jeden angemeldeten Benutzer verwendet, vorausgesetzt, jemand ist angemeldet. Dieser Wert entspricht User.Identity.Name.
Pure.Krome
18

User.Identityist ein IPrincipal- 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 WebSecuritybefindet sich im Nuget-Paket Microsoft.AspNet.WebPages.WebDatain 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.)

Simon_Weaver
quelle
+1 für WebSecurity.CurrentUserId. Sogar der AccountController mit Vorlagen verwendet, WebSecurity.GetUserId(User.Identity.Name)was ein wenig dumm erscheint, wenn er CurrentUserIdverfügbar ist.
Gone Coding
11

Wenn Sie die ASP.NET-Mitgliedschaft verwenden (die wiederum das IPrincipal-Objekt verwendet):

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

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:

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

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

}
user3175805
quelle
3

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.

ebrown
quelle
2
using System.Web.Security;

MembershipUser user = Membership.GetUser(User.Identity.Name); 
int id = Convert.ToInt32(user.ProviderUserKey);
user3361768
quelle
1

Es ist die ProviderUserKey-Eigenschaft.

System.Web.Security.MembershipUser u;
u.ProviderUserKey
Alex
quelle
Wie würde ich dich zum aktuell angemeldeten Benutzer machen?
Pupeno
1

Einfach....

int userID = WebSecurity.CurrentUserId;
Izztraab
quelle
Obwohl dies eine der nützlicheren Lösungen ist, wurde diese Antwort durch die Antwort von Simon_Weaver (7 Monate zuvor) abgedeckt.
Gone Coding
0

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, dann WebSecurity.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.

James Tayler
quelle