2013-08-26 5 views
138
  • Wie kann ich die ID des aktuell angemeldeten Benutzers in MVC 5 bekommen? Ich habe die StackOverflow-Vorschläge ausprobiert, aber sie scheinen nicht für MVC 5 zu sein.
  • Auch, was ist die MVC 5 Best Practice der Zuweisung von Zeug an die Benutzer? (ZB ein User soll Items haben. Soll ich das Id Benutzerhandbuch in Item? Kann ich die User Klasse mit einer List<Item> Navigationseigenschaft erweitern?

Ich bin „Individuelle Benutzerkonten“ von der MVC-Vorlage.Wie bekomme ich den aktuellen Benutzer und wie benutze ich die Benutzerklasse in MVC5?

diese Versuchte:

'Membership.GetUser()' ist null.

+0

Hinzugefügt die Referenzen von dem, was ich versucht habe. Der letzte war in MVC4 in Ordnung, aber nicht in MVC5. Auch ich brauche einige Best Practice von "using User" :) –

+0

Wenn Sie sagen, dass Sie MVC 5 verwenden, was verwenden Sie für die Mitgliedschaft? OWin.Sicherheit? – Aron

+0

"Einzelne Benutzerkonten" aus der MVC-Vorlage. –

Antwort

278

Wenn Sie in einer ASP.NET MVC-Controller sind Codierung,

using Microsoft.AspNet.Identity; 

... 

User.Identity.GetUserId(); 

Erwähnenswert verwenden, dass User.Identity.IsAuthenticated und User.Identity.Name funktioniert ohne Zugabe der oben using Erklärung erwähnt. Aber GetUserId() wird ohne es nicht vorhanden sein.

Wenn Sie in einer anderen Klasse als ein Regler sind, verwenden Sie

HttpContext.Current.User.Identity.GetUserId(); 

In der Standardvorlage von MVC 5, ist Benutzer-ID eine GUID als String gespeichert.

Keine best practice noch, fand aber einige wertvolle Informationen über das Benutzerprofil erstreckt:

+8

Benutzerauthentifizierung und -autorisierung wurden für ASP.NET MVC 5 geändert. Jetzt handelt es sich um eine anspruchsbasierte Authentifizierung mit Schnittstellen und generischen Repositories, die Sie mit EF oder einem anderen Anbieter verwenden können (die EF-Implementierung wird standardmäßig verwendet). Da 'GetUserId' eine Erweiterungsmethode ist, die am unteren Rand von' Ass_Start \ IdentityConfig.cs' gespeichert ist, müssen Sie, wo immer Sie sie verwenden möchten, für einen anderen Namespace die 'using Microsoft.AspNet.Identity' festlegen Die Erweiterung wird sichtbar. –

+1

survey.UserId = Guid.Parse (User.Identity.GetUserId()); – NicoJuicy

+0

Wenn ich die Verwendungsreferenz hinzufüge, wird der Benutzer immer noch rot unterstrichen? Warum sollte das sein? – Zapnologica

7

Die ID zu bekommen ist ziemlich einfach und Sie haben das gelöst.

Ihre zweite Frage ist ein wenig komplizierter.

Also, das ist alles Prerelease-Zeug gerade jetzt, aber das allgemeine Problem, das Sie gegenüberstehen, ist, wo Sie den Benutzer mit neuen Eigenschaften (oder eine Items-Sammlung in Ihrer Frage) erweitern.

Sie erhalten sofort eine Datei mit dem Namen IdentityModel im Ordner Models (zum Zeitpunkt des Schreibens). Dort hast du ein paar Klassen; ApplicationUser und ApplicationDbContext.Um Ihre Sammlung von Items hinzuzufügen, müssen Sie die Klasse ApplicationUser genauso ändern, als ob Sie eine normale Klasse wären, die Sie mit Entity Framework verwendet haben. In der Tat, wenn Sie einen kurzen Blick unter die Haube werfen, werden Sie feststellen, dass alle identitätsbezogenen Klassen (Benutzer, Rolle usw.) nur POCOs mit den entsprechenden Datenanmerkungen sind, so dass sie gut mit EF6 spielen.

Als nächstes müssen Sie einige Änderungen am AccountController-Konstruktor vornehmen, damit dieser Ihren DbContext verwenden kann.

Jetzt ist es etwas esoterisch, um das ganze Benutzerobjekt für Ihren eingeloggten Benutzer zu bekommen, um ehrlich zu sein.

var userWithItems = (ApplicationUser)await IdentityManager.Store.Users 
    .FindAsync(User.Identity.GetUserId(), CancellationToken.None); 

Diese Linie die Arbeit erledigt wird erhalten, und Sie werden userWithItems.Items zugreifen können, wie Sie möchten.

HTH

+0

Ich glaube nicht, dass es so etwas wie Pre-Release-Dokumente für all das gibt? –

+0

@Derek Tomes - Nicht, dass ich rübergekommen bin. Ich rechne damit, dass wir bis zum 13. November auf echte Dokumente warten müssen. Es ist nicht toll, um ehrlich zu sein, es gibt sogar eine Anfrage für eine bessere Anleitung bei Uservoice - http://aspnet.uservoice.com/forums/41199-general-asp-net/suggestions/4148568-better-guidance-documentation-on -mvc-5 – Stimul8d

+0

ok, aber wie komme ich zu einer Instanz vom Typ 'AccountController'? – nest

0

Ich fühle deinen Schmerz, ich versuche, das gleiche zu tun. In meinem Fall möchte ich nur den Benutzer löschen.

Ich habe eine Basis-Controller-Klasse erstellt, von der alle meine Controller erben. Darin überschreiben ich OnAuthentication und die filterContext.HttpContext.User to null

gesetzt Das ist das Beste, was ich zu weit geschafft haben ...

public abstract class ApplicationController : Controller 
{ 
    ... 
    protected override void OnAuthentication(AuthenticationContext filterContext) 
    { 
     base.OnAuthentication(filterContext); 

     if (...) 
     { 
      // You may find that modifying the 
      // filterContext.HttpContext.User 
      // here works as desired. 
      // In my case I just set it to null 
      filterContext.HttpContext.User = null; 
     } 
    } 
    ... 
} 
26

Versuchen Sie so etwas wie:

var store = new UserStore<ApplicationUser>(new ApplicationDbContext()); 
var userManager = new UserManager<ApplicationUser>(store); 
ApplicationUser user = userManager.FindByNameAsync(User.Identity.Name).Result; 

Arbeiten mit RTM.

+11

Es erzwingt unnötige Datenbankauslösung. – Arash

+2

@Arash, wie soll die Anwendung das Objekt des Benutzers erhalten, ohne die Datenbank zu kontaktieren? – fabspro

+2

@Arash macht nichts, ich sehe was du meinst. Die ID kann mit User.Identity.GetUserId() abgerufen werden; ohne irgendeine Datenbankauslösung. – fabspro

14

Wenn Sie das ApplicationUser Objekt in einer Zeile Code (wenn Sie die neueste ASP.NET Identität installiert haben), versuchen:

ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId()); 

Hier finden Sie die folgenden using-Anweisungen benötigen:

using Microsoft.AspNet.Identity; 
using Microsoft.AspNet.Identity.Owin; 
Verwandte Themen