User
devrait avoir Items
. Devrais-je stocker la Id
de l'utilisateur dans Item
? Puis-je étendre la classe User
avec une propriété de navigation List<Item>
?J'utilise des "comptes d'utilisateurs individuels" du modèle MVC.
Essayé ces:
'Membership.GetUser ()' est null.
Si vous codez dans un contrôleur ASP.NET MVC, utilisez
using Microsoft.AspNet.Identity;
...
User.Identity.GetUserId();
Il convient de mentionner que User.Identity.IsAuthenticated
et User.Identity.Name
fonctionnent sans ajouter l’instruction using
mentionnée ci-dessus. Mais GetUserId()
ne sera pas présent sans elle.
Si vous êtes dans une classe autre qu'un contrôleur, utilisez
HttpContext.Current.User.Identity.GetUserId();
Dans le modèle par défaut de MVC 5, l'ID utilisateur est un GUID stocké sous forme de chaîne.
Pas encore de meilleure pratique, mais j'ai trouvé des informations utiles sur l'extension du profil de l'utilisateur:
Identity
: http://blogs.msdn.com/b/webdev/archive/2013/06/27/introducing-asp-net-identity-membership-system-for-asp-net-applications.aspxEssayez quelque chose comme:
var store = new UserStore<ApplicationUser>(new ApplicationDbContext());
var userManager = new UserManager<ApplicationUser>(store);
ApplicationUser user = userManager.FindByNameAsync(User.Identity.Name).Result;
Fonctionne avec RTM.
Si vous voulez que l'objet ApplicationUser soit dans une ligne de code (si vous avez la dernière identité ASP.NET installée), essayez:
ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());
Vous aurez besoin des instructions using suivantes:
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
Obtenir l'identifiant est assez simple et vous l'avez résolu.
Votre deuxième question est cependant un peu plus compliquée.
Il s’agit donc, pour l’instant, de tout ce qui concerne les versions préliminaires, mais le problème commun que vous rencontrez est de savoir si vous étendez l’utilisateur avec de nouvelles propriétés (ou une collection d’éléments dans votre question).
Dès la sortie de la boîte, vous obtiendrez un fichier appelé IdentityModel
dans le dossier Modèles (au moment de l'écriture). Là-bas, vous avez deux cours. ApplicationUser
et ApplicationDbContext
. Pour ajouter votre collection de Items
, vous voudrez modifier la classe ApplicationUser
, comme vous le feriez s'il s'agissait d'une classe normale que vous utilisiez avec Entity Framework. En fait, si vous jetez un coup d'œil sous le capot, vous constaterez que toutes les classes liées à l'identité (User, Role, etc.) ne sont plus que des POCO avec les annotations de données appropriées, de sorte qu'elles jouent bien avec EF6.
Ensuite, vous devrez apporter quelques modifications au constructeur AccountController
afin qu’il sache utiliser votre DbContext.
public AccountController()
{
IdentityManager = new AuthenticationIdentityManager(
new IdentityStore(new ApplicationDbContext()));
}
Maintenant, obtenir l’objet utilisateur complet pour votre utilisateur connecté est un peu ésotérique.
var userWithItems = (ApplicationUser)await IdentityManager.Store.Users
.FindAsync(User.Identity.GetUserId(), CancellationToken.None);
Cette ligne fera le travail et vous pourrez accéder à userWithItems.Items
comme vous le souhaitez.
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;
si quelqu'un d'autre se trouve dans cette situation: je crée un e-mail de vérification pour me connecter à mon application, de sorte que mes utilisateurs ne sont pas encore connectés. Cependant, j'ai utilisé le formulaire ci-dessous pour rechercher un e-mail saisi lors de la connexion, qui constitue une variante de la solution @firecape.
ApplicationUser user = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindByEmail(Email.Text);
vous aurez également besoin des éléments suivants:
using Microsoft.AspNet.Identity;
et
using Microsoft.AspNet.Identity.Owin;
Dans .Net MVC5 core 2.2, j’utilise HttpContext.User.Identity.Name. Cela a fonctionné pour moi.
Je ressens ta douleur, j'essaie de faire la même chose. Dans mon cas, je veux juste effacer l'utilisateur.
J'ai créé une classe de contrôleur de base dont tous mes contrôleurs héritent. Dans ce document, je remplace OnAuthentication
et configure le filterContext.HttpContext.User to null
C'est le meilleur que j'ai réussi jusqu'ici ...
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;
}
}
...
}