User
Items
haben. Soll ich die Id
des Benutzers in Item
speichern. Kann ich die User
-Klasse um eine List<Item>
-Navigationseigenschaft erweitern?Ich verwende "Individuelle Benutzerkonten" aus der MVC-Vorlage.
Versuchte diese:
'Membership.GetUser ()' ist null.
Wenn Sie in einem ASP.NET-MVC-Controller codieren, verwenden Sie
using Microsoft.AspNet.Identity;
...
User.Identity.GetUserId();
Erwähnenswert ist, dass User.Identity.IsAuthenticated
und User.Identity.Name
funktionieren, ohne dass die oben angegebene using
-Anweisung hinzugefügt wird. Aber GetUserId()
wird ohne sie nicht anwesend sein.
Wenn Sie sich in einer anderen Klasse als einem Controller befinden, verwenden Sie
HttpContext.Current.User.Identity.GetUserId();
In der Standardvorlage von MVC 5 ist die Benutzer-ID eine GUID, die als Zeichenfolge gespeichert ist.
Noch keine Best Practice, aber einige nützliche Informationen zum Erweitern des Benutzerprofils gefunden:
Identity
: http://blogs.msdn.com/b/webdev/archive/2013/06/27/introducing-asp-net-identity-membership-system-for-asp-net-applications.aspxVersuchen Sie etwas wie:
var store = new UserStore<ApplicationUser>(new ApplicationDbContext());
var userManager = new UserManager<ApplicationUser>(store);
ApplicationUser user = userManager.FindByNameAsync(User.Identity.Name).Result;
Funktioniert mit RTM.
Wenn Sie möchten, dass das ApplicationUser-Objekt in einer Codezeile steht (wenn Sie die neueste ASP.NET-Identität installiert haben), versuchen Sie Folgendes:
ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());
Sie benötigen folgende using-Anweisungen:
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
Die Id zu bekommen ist ziemlich einfach und Sie haben das gelöst.
Ihre zweite Frage ist jedoch etwas ausführlicher.
Dies ist im Moment alles für die Vorabversion, aber das häufigste Problem ist, dass Sie den Benutzer mit neuen Eigenschaften (oder einer Elementsammlung in Ihrer Frage) erweitern.
Im Auslieferungszustand erhalten Sie eine Datei namens IdentityModel
im Ordner Models (zum Zeitpunkt des Schreibens). Dort haben Sie ein paar Klassen. ApplicationUser
und ApplicationDbContext
. Um Ihre Sammlung von Items
hinzuzufügen, müssen Sie die ApplicationUser
-Klasse ändern, genau wie Sie es tun würden, wenn dies eine normale Klasse wäre, die Sie mit Entity Framework verwendet haben. Wenn Sie einen kurzen Blick unter die Haube werfen, werden Sie feststellen, dass alle identitätsbezogenen Klassen (Benutzer, Rollen usw.) nur POCOs mit den entsprechenden Datenanmerkungen sind, sodass sie Nice mit EF6 spielen.
Als Nächstes müssen Sie einige Änderungen am Konstruktor AccountController
vornehmen, damit er weiß, dass Sie DbContext verwenden.
public AccountController()
{
IdentityManager = new AuthenticationIdentityManager(
new IdentityStore(new ApplicationDbContext()));
}
Nun, es ist ein bisschen esoterisch, das gesamte Benutzerobjekt für Ihren angemeldeten Benutzer zu erhalten, um ehrlich zu sein.
var userWithItems = (ApplicationUser)await IdentityManager.Store.Users
.FindAsync(User.Identity.GetUserId(), CancellationToken.None);
Diese Zeile erledigt den Job und Sie können auf userWithItems.Items
wie gewünscht zugreifen.
HTH
string userName="";
string userId = "";
int uid = 0;
if (HttpContext.Current != null && HttpContext.Current.User != null
&& HttpContext.Current.User.Identity.Name != null)
{
userName = HttpContext.Current.User.Identity.Name;
}
using (DevEntities context = new DevEntities())
{
uid = context.Users.Where(x => x.UserName == userName).Select(x=>x.Id).FirstOrDefault();
return uid;
}
return uid;
wenn jemand diese Situation hat: Ich erstelle eine E-Mail-Bestätigung, um mich bei meiner App anzumelden, sodass meine Benutzer noch nicht angemeldet sind. Ich habe jedoch mithilfe der folgenden Anweisung nach einer E-Mail gesucht, die bei der Anmeldung eingegeben wurde
ApplicationUser user = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindByEmail(Email.Text);
sie benötigen außerdem Folgendes:
using Microsoft.AspNet.Identity;
und
using Microsoft.AspNet.Identity.Owin;
In .Net MVC5 Core 2.2 verwende ich HttpContext.User.Identity.Name. Es hat bei mir funktioniert.
Ich fühle deinen Schmerz, ich versuche dasselbe 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. In diesem überschreibe ich OnAuthentication
und setze den filterContext.HttpContext.User to null
Das ist das Beste, was ich bisher geschafft habe ...
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;
}
}
...
}