Mise à jour des données utilisateur – Identité ASP.NET

J’ai ajouté des champs personnalisés à la classe ApplicationUser
J’ai également créé un formulaire permettant à l’utilisateur d’entrer / modifier les champs.
Cependant, pour une raison quelconque, je ne peux pas mettre à jour les champs de la firebase database.

 [HttpPost] [ActionName("Edit")] [ValidateAntiForgeryToken] public async Task Manage(EditProfileViewModel model) { if (ModelState.IsValid) { // Get the current application user var user = User.Identity.GetApplicationUser(); // Update the details user.Name = new Name { First = model.FirstName, Last = model.LastName, Nickname = model.NickName }; user.Birthday = model.Birthdate; // This is the part that doesn't work var result = await UserManager.UpdateAsync(user); // However, it always succeeds inspite of not updating the database if (!result.Succeeded) { AddErrors(result); } } return RedirectToAction("Manage"); } 

Mon problème est similaire aux propriétés personnalisées de MVC5 ApplicationUser , mais cela semble utiliser une version antérieure d’Identity car la classe IdentityManager ne semble pas exister.

Quelqu’un peut-il me guider sur la façon de mettre à jour User informations User dans la firebase database?

MISE À JOUR: Si j’inclus tous les champs dans le formulaire de registre, toutes les valeurs sont stockées dans le champ approprié d’un nouvel enregistrement de la table Users de la firebase database.

Je ne sais pas modifier les champs d’un utilisateur existant (ligne dans la table users ). UserManager.UpdateAsync(user) ne fonctionne pas.

Notez également que mon problème est davantage lié à l’identité que EntityFramework

OK … J’ai passé des heures à essayer de comprendre pourquoi userManager.updateAsync ne persisterait pas les données utilisateur que nous modifions … jusqu’à ce que je parvienne à la conclusion suivante:

La confusion provient du fait que nous créons le UserManager dans une ligne comme celle-ci:

 var manager = new UserManager(new UserStore(new MyDbContext())); 

… alors nous utilisons manager.UpdateAsync( user ); mais cela mettra l’utilisateur à jour dans le contexte, puis nous devrons enregistrer les modifications apscopes au contexte de firebase database de l’identité. Donc, la question est de savoir comment obtenir le contexte d’identité de la manière la plus simple.

Pour résoudre ce problème, nous ne devrions pas créer le UserManager dans une ligne … et voici comment je le fais:

 var store = new UserStore(new MyDbContext()); var manager = new UserManager(store); 

puis après avoir mis à jour l’utilisateur en appelant

 manager.UpdateAsync(user); 

alors vous allez au contexte

 var ctx = store.context; 

puis

 ctx.saveChanges(); 

wahooooooo … a persisté 🙂

J’espère que cela aidera quelqu’un qui a tiré ses cheveux pendant quelques heures: P

Si vous laissez n’importe lequel des champs pour ApplicationUser OR IdentityUser null, la mise à jour sera réussie mais ne sauvegardera pas les données dans la firebase database.

Exemple de solution:

 ApplicationUser model = UserManager.FindById(User.Identity.GetUserId()) 

Ajoutez les champs nouvellement mis à jour:

 model.Email = AppUserViewModel.Email; model.FName = AppUserViewModel.FName; model.LName = AppUserViewModel.LName; model.DOB = AppUserViewModel.DOB; model.Gender = AppUserViewModel.Gender; 

Appelez UpdateAsync

 IdentityResult result = await UserManager.UpdateAsync(model); 

J’ai testé cela et ça marche.

Le contexte OWIN vous permet d’obtenir le contexte de firebase database. Semble fonctionner correctement jusqu’à présent, et après tout, j’ai eu l’idée de la classe ApplciationUserManager qui fait la même chose.

  internal void UpdateEmail(HttpContext context, ssortingng userName, ssortingng email) { var manager = context.GetOwinContext().GetUserManager(); var user = manager.FindByName(userName); user.Email = email; user.EmailConfirmed = false; manager.Update(user); context.GetOwinContext().Get().SaveChanges(); } 

Le UserManager n’a pas fonctionné, et comme @Kevin Junghans l’a écrit,

UpdateAsync valide simplement la mise à jour du contexte, vous devez toujours enregistrer le contexte pour qu’il soit validé dans la firebase database

Voici une solution rapide (avant les nouvelles fonctionnalités dans ASP.net identity v2) que j’ai utilisé dans un projet de formulaires Web. le

 class AspNetUser :IdentityUser 

A été migré depuis SqlServerMembership aspnet_Users. Et le contexte est défini:

 public partial class MyContext : IdentityDbContext 

Je m’excuse pour la reflection et le code synchrone – si vous mettez ceci dans une méthode asynchrone, utilisez await pour les appels asynchrones et supprimez les tâches et Wait () s. L’arg, props, contient les noms des propriétés à mettre à jour.

  public static void UpdateAspNetUser(AspNetUser user, ssortingng[] props) { MyContext context = new MyContext(); UserStore store = new UserStore(context); Task cUser = store.FindByIdAsync(user.Id); cUser.Wait(); AspNetUser oldUser = cUser.Result; foreach (var prop in props) { PropertyInfo pi = typeof(AspNetUser).GetProperty(prop); var val = pi.GetValue(user); pi.SetValue(oldUser, val); } Task task = store.UpdateAsync(oldUser); task.Wait(); context.SaveChanges(); } 

J’ai également rencontré des problèmes lors de l’utilisation de UpdateAsync lors du développement d’une version de SimpleSecurity qui utilise ASP.NET Identity. Par exemple, j’ai ajouté une fonctionnalité permettant de réinitialiser le mot de passe pour append un jeton de réinitialisation du mot de passe aux informations utilisateur. Au début, j’ai essayé d’utiliser UpdateAsync et il a obtenu les mêmes résultats que vous. J’ai fini par encapsuler l’entité utilisateur dans un modèle de référentiel et l’ai fait fonctionner. Vous pouvez regarder le projet SimpleSecurity pour un exemple . Après avoir travaillé avec ASP.NET Identity plus encore (la documentation est encore inexistante), je pense que UpdateAsync valide simplement la mise à jour du contexte, vous devez toujours enregistrer le contexte pour qu’il s’engage dans la firebase database.

J’ai essayé la fonctionnalité de la même manière et lorsque j’appelle la méthode UserManager.Updateasync , elle réussit mais il n’y a pas de mise à jour dans la firebase database. Après un certain temps, j’ai trouvé une autre solution pour mettre à jour les données dans la table aspnetusers qui suit:

1) vous devez créer la classe UserDbContext héritant de la classe IdentityDbContext comme ceci:

 public class UserDbContext:IdentityDbContext { public UserDbContext(): base("DefaultConnection") { this.Configuration.ProxyCreationEnabled = false; } } 

2) puis, dans le contrôleur de compte, mettez à jour les informations utilisateur comme ceci:

 UserDbContext userDbContext = new UserDbContext(); userDbContext.Entry(user).State = System.Data.Entity.EntityState.Modified; await userDbContext.SaveChangesAsync(); 

user est votre entité mise à jour.

J’espère que ceci vous aidera.

Excellent!!!

 IdentityResult result = await UserManager.UpdateAsync(user); 

Basé sur votre question et également noté dans le commentaire.

Quelqu’un peut-il me guider sur la façon de mettre à jour les informations utilisateur dans la firebase database?

Oui, le code est correct pour mettre à jour n’importe quel ApplicationUser vers la firebase database.

IdentityResult result = await UserManager.UpdateAsync(user);

  • Vérifier les contraintes de toutes les valeurs requirejses du champ
  • Check for UserManager est créé avec ApplicationUser.

UserManager UserManager = new UserManager(new UserStore(new ApplicationDbContext()));

Cela fonctionne pour moi. J’utilise Identity 2.0, il semble que GetApplicationUser n’existe plus.

  var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); if (!ssortingng.IsNullOrEmpty(form["FirstName"])) { user.FirstName = form["FirstName"]; } if (!ssortingng.IsNullOrEmpty(form["LastName"])) { user.LastName = form["LastName"]; } IdentityResult result = await UserManager.UpdateAsync(user); 

J’utilise le nouveau EF & Identity Core et j’ai le même problème, avec en plus cette erreur:

L’instance de type d’entité ne peut pas être suivie car une autre instance de ce type avec la même clé est déjà suivie.

Avec le nouveau modèle DI, j’ai ajouté le contrôleur du constructeur au contexte de la firebase database.

J’ai essayé de voir quel était le conflit avec _conext.ChangeTracker.Ensortinges() et d’append AsNoTracking() à mes appels sans succès.

Je dois seulement changer l’état de mon object (dans ce cas, l’identité)

 _context.Entry(user).State = EntityState.Modified; var result = await _userManager.UpdateAsync(user); 

Et travaillé sans créer un autre magasin ou object et cartographie.

J’espère que quelqu’un d’autre est utile mes deux cents.

Ajoutez le code suivant à votre fichier Startup.Auth.cs sous le constructeur statique:

  UserManagerFactory = () => new UserManager(new UserStore(new ApplicationDbContext())); OAuthOptions = new OAuthAuthorizationServerOptions { TokenEndpointPath = new PathSsortingng("/Token"), Provider = new ApplicationOAuthProvider(PublicClientId, UserManagerFactory), AuthorizeEndpointPath = new PathSsortingng("/api/Account/ExternalLogin"), AccessTokenExpireTimeSpan = TimeSpan.FromDays(14), AllowInsecureHttp = true }; 

La ligne de réglage UserManagerFactory du code est ce que vous utilisez pour associer votre DataContext personnalisé à UserManager. Une fois cela fait, vous pouvez obtenir une instance de UserManager dans ApiController et la méthode UserManager.UpdateAsync (utilisateur) fonctionnera car elle utilise votre DataContext pour enregistrer les propriétés supplémentaires que vous avez ajoutées à votre utilisateur personnalisé.