MVC5: UserManager.AddToRole(): “Erreur lors de l'Ajout de l'Utilisateur pour Rôle: nom d'utilisateur n'est pas trouvé”?
J'ai fait des expériences avec MVC5/EF6 et d'essayer la nouvelle Identité de l'Authentification avec le Code-Première Migrations. Tout dans la solution est actuellement en train de construire et je peux ajouter un Migration
, mais lorsque j'effectue une update-database
par le biais de la package manager console
dans VS2013, mon Configuration.cs
fichier ne parvient pas à traiter mes données de test dans mes Tables et sorties Error Adding User to Role: UserId not found
.
J'ai essayé de définir explicitement un ID Utilisateur et en le laissant à être générés par le Gestionnaire (comme dans certains exemples), mais à chaque fois que je reçois le même message d'erreur. Je sais que l'erreur est d'échouer dans mon #region User & User Roles
de mon Configuration.cs
fichier, mais je ne sais pas pourquoi:
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using PersonalPortfolio2.Helper;
using PersonalPortfolio2.Models;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Migrations;
using System.Diagnostics;
using System.Linq;
namespace PersonalPortfolio2.Models
{
public sealed class Configuration : DbMigrationsConfiguration<PersonalPortfolio2.Models.ApplicationDbContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
}
protected override void Seed(PersonalPortfolio2.Models.ApplicationDbContext context)
{
BlobHelper bh = new BlobHelper();
//LocationHelper lh = new LocationHelper();
ApplicationDbContext db = new ApplicationDbContext();
#region Roles
try
{
List<string> myRoles = new List<string>(new string[] { "Root", "Admin", "Outsider", "Client", "Primary" });
var RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));
foreach (string r in myRoles)
{
RoleManager.Create(new IdentityRole(r));
}
}
catch (Exception ex)
{
throw new Exception("Error Create Roles: " + ex.Message);
}
#endregion
#region User & User Roles
var store = new UserStore<ApplicationUser>(context);
var manager = new UserManager<ApplicationUser>(store);
List<ApplicationUser> myUsers = GetTestUsers();
var passwordHasher = new PasswordHasher();
foreach (var u in myUsers)
{
var userExists = db.Users.Where(a => a.Email == u.Email).FirstOrDefault();
if (userExists == null)
{
var user = new ApplicationUser
{
Email = u.Email,
PasswordHash = passwordHasher.HashPassword("P@ssword1"),
LockoutEnabled = false,
Name = u.Name,
Position = u.Position,
RegisteredDate = DateTime.Now,
LastVisitDate = DateTime.Now,
OrganizationId = u.OrganizationId,
ProfilePictureSrc = u.ProfilePictureSrc,
};
try
{
var userCreateResult = manager.Create(user);
}
catch (Exception ex)
{
throw new Exception("Error Add User: " + ex.Message + "\n" + ex.InnerException);
}
//Add User to Roles
List<string> usersRoles = GetUserRoles(u.Email);
bool codeHit = false;
foreach (string role in usersRoles)
{
try
{
codeHit = true;
manager.AddToRole(user.Id, role);
}
catch (Exception ex)
{
//ERROR!
throw new Exception("Error Adding User to Role: " + ex.Message + "\n" + ex.Data + "\n" + ex.InnerException + "\nName: " + user.Name + "\nEmail: " + user.Email + "\nuser.ID: " + user.Id + "\nu.Id: " + u.Id + "\nRole: " + role + "\nCodeHit: " + codeHit);
}
}
}
}
#endregion
}
#region Helpers
private List<ApplicationUser> GetTestUsers()
{
List<ApplicationUser> testUsers = new List<ApplicationUser>
{
new ApplicationUser
{
Id = "1",
Email = "[email protected]",
Name = "Admin User",
RegisteredDate = System.DateTime.Now,
LastVisitDate = System.DateTime.Now,
Position = "Site Administrator",
PhoneNumber = "1234564321",
},
new ApplicationUser
{
Id = "2",
Email = "[email protected]",
Name = "James Woods",
RegisteredDate = System.DateTime.Now,
LastVisitDate = System.DateTime.Now,
Position = "Software Developer /Web Designer",
PhoneNumber = "1234567890",
},
new ApplicationUser
{
Id = "3",
Email = "[email protected]",
Name = "Tyler Perry",
RegisteredDate = System.DateTime.Now,
LastVisitDate = System.DateTime.Now,
Position = "Company Contact",
PhoneNumber = "1234567890",
}
};
return testUsers;
}
public List<string> GetUserRoles(string user)
{
List<string> myRoles = new List<string>();
switch (user)
{
//"Root", "Admin", "Outsider", "Client", "Primary"
case "[email protected]":
myRoles = new List<string>(new string[] { "Root", "Admin" });
break;
case "[email protected]":
myRoles = new List<string>(new string[] { "Admin" });
break;
case "[email protected]":
myRoles = new List<string>(new string[] { "Client", "Outsider" });
break;
default:
myRoles = new List<string>(new string[] {"[user] not found."});
break;
}
return myRoles;
}
#endregion
}
}
Quelqu'un peut offrir un aperçu ici avec ce que j'ai peut être oublié? Pour plus de détails, mon catch
de tresorerie est sortie le suivant:
Error Adding User to Role: UserId not found.
System.Collections.ListDictionaryInternal
Name: Admin User
Email: Admin@abc.com
user.ID: 1
u.Id: 1
Role: Root
CodeHit: True
Quand j'commentaire explicite Id = "1",
pour mon Utilisateur Admin, la user.ID
et u.Id
devient: ab753316-3d7b-4f98-a13a-d19f7c926976
. J'avais pensé qu'il pourrait être mon aide de méthodes de GetTestUsers()
ou GetUserRoles(u.Email)
qui ont le problème, mais entre mon try/catch
et la codeHit
variable booléenne j'utilise, j'ai vérifié, la question est définitivement venant de manager.AddToRole(user.Id, role)
.
- Avez-vous réussi à résoudre votre problème?
Vous devez vous connecter pour publier un commentaire.
Je laisse ce voici pour tous ceux qui pourraient avoir eu un problème similaire. J'ai eu exactement les mêmes "symptômes". Il s'avère que le problème lié au mot de passe stocké n'adhérant pas à la configuration de la stratégie de mot de passe (au moins une lettre majuscule, char, une minuscule char, etc etc).
Comme par ci-dessous les commentaires et les réponses, en général, la même vague message d'erreur est renvoyée lorsque l'un quelconque de la création d'un utilisateur, des contraintes ou politiques ne sont pas respectées.
Cela pourrait inclure les éléments suivants:
Il y a vraiment un large éventail de questions qui peuvent causer cette erreur. Si le ci-dessus ne résolvent pas votre problème, je vous suggère de:
CraftBeerHipsterDude réponse m'a aidé à trouver la réponse à la même situation que j'avais. Si AddToRole échoue, l'astuce est de regarder le résultat renvoyé de Usermanager.Créer(...). Il pourrait ne pas lancer une exception, mais toujours retourner un résultat qui dit que la création a échoué. Dans mon cas c'était "nom d'utilisateur existe déjà".
Généraliser: Vérifier les résultats des opérations précédentes pour traquer l'erreur réelle.
Create
encore attribue un nouveau numéro d'identification de l'utilisateur, même si il ya des erreurs masquées. Mon erreur a été "le Nom ne peut pas être vide"...Configuration.cs
donc je n'étais pas capable de mettre un point d'arrêt de travail sur elle jusqu'à ce que j'ai déplacé le code dans un contrôleur que j'ai pu activer et d'une variable résultat comme suit:var result = await userManager.CreateAsync(user, "somePassword");
. A une adresse e-mail invalide de toutes choses! "Ne peut contenir que des chiffres ou des lettres"Réponse à la question créateur: Le nom d'utilisateur ne doivent pas être saisis, laissons le cadre de l'entité à créer pour les utilisateurs.. Vous êtes aussi en train d'essayer de le saisir comme un entier, mais l'Id pour les utilisateurs en fonction des rôles de sécurité est un GUID dans la forme d'une chaîne, donc il ne serait pas de toute façon d'essayer d'ajouter un entier de valeur pour une colonne attend une chaîne de caractères.
Maintenant, ce n'était pas le problème pour moi, mais j'ai eu un couple de d'autres problèmes avec le même message d'erreur:
J'ai essayé de comprendre ce que j'étais absente, mais rien trouvé à redire.
J'ai donc utilisé une autre instance de VS comme un débogueur de code graine(trouvé ça dans un autre fil):
J'ai remarqué que l'utilisateur, en effet, avait un Id a été ajouté pour le rôle.
Dans le final, j'ai été capable de faire un contournement par l'ajout d'un vide bloc catch.. le code ne marche pas lancer des exceptions en raison d'une fausse erreur et les utilisateurs sont ajoutés à la bonne rôles:
Avant j'ai essayé d'ajouter un nouvel utilisateur à un rôle, la graine semblait revenir à la création de l'utilisateur et l'utilisateur n'a jamais été créé dans la base de données utilisateur.
Mais quand je l'ai entièrement supprimé l'ajout de la partie, l'utilisateur a été ajouté à la base de données, et sur la deuxième manche de un peu modifié code de configuration, l'utilisateur peut être ajouté à un rôle, m'amenant à penser que c'était une fausse erreur est générée.. ignorant cette fausse erreur avec le vide d'un bloc catch semble également ignorer la restauration de la création d'un utilisateur(qui doit se passer derrière les rideaux juste avant l'ajout de la partie) conduisant à l'utilisateur existante lors de l'ajout de rôle une partie du code.
Espère que cela aide quelqu'un
EDIT:
Ci-dessus fixe quasi-totalité de mes maux de tête, mais j'ai remarqué qu'il y avait encore quelques 300 comptes qui n'a pas pu être créé(mais pas d'erreurs jeté). Une simple JOINTURE EXTERNE COMPLÈTE et de l'examen de l'utilisateur de la base de données avec la base de données source de la table me conduisent à penser que les utilisateurs avec un tiret(-) dans les deux la valeur de "nom d'utilisateur" et "e-Mail" colonnes arrêté les utilisateurs d'être créé, et ce fut le cas.
C'est une solution facile, il suffit de configurer le gestionnaire des utilisateurs pour utiliser plus de caractères alphanumériques:
(et même si le nom de l'attribut semble indiquer qu "nom d'Utilisateur" elle a également affecté "e-Mail")
//Miske
Je voudrais éviter d'utiliser le UserManager et RoleManager dans votre Semences méthode. Au lieu de cela je n'utilise que le contexte. Quelque chose que j'utilise est la suivante, ce qui crée un utilisateur et lui assigne un rôle:
La Entité classes sont des implémentations personnalisées (parce que je voulais utiliser Guid que les Identifiants), mais ils tirent des classes du framework. Avec qui il doit travailler de la même manière si vous les modifiez le cadre approprié classes.
MODIFIER
J'ai supprimé les classes personnalisées et mis à la les classes du framework, parce qu'il y avait une certaine confusion.
var userCreateResult = manager.Create(user);
processus, ni leAspNetUsers
niAspNetUserRoles
a même une entrée.new ApplicationUser
avecUserName = u.Email
, que j'ai pris à un champ nom d'utilisateur, je n'ai pas besoin dans mon application. Quand j'ai passez la souris sur le champ, il ditstring IdentityUser<string,IdentityUserLogin,IdentityUserRole,IdentityUserClaim>.UserName
. Toutes les pensées pourquoi réglageUsername = u.Email
fixé mon problème deUserId not found
?UserName = u.Email
à l'intérieur de chacun de mesnew ApplicationUser { ... }
définitions. Espérons que cela aide!Cela a sauvé ma 2ème jour . Merci @Daffy Punk. Dans mon cas, la question était de mot de passe. qui a été "abc" avant de.
le problème dans mon cas est que j'utilise (nom d'utilisateur) de l'utilisateur au lieu de l'Id, code du travail ci-dessous: