Je suis nouveau dans le cadre d'identité ASP.NET et j'essaie de faire certaines choses que j'avais l'habitude de faire dans l'ancien cadre FormsAuthentication.
Ce que je veux faire, c'est autoriser un utilisateur administratif à créer un nouvel utilisateur à l'aide de la vue d'enregistrement existante (ou similaire) à partir de l'application. Une fois cette opération terminée, j'aimerais associer de manière relationnelle cet utilisateur (éventuellement à l'aide de l'ID généré) à d'autres zones du système.
Comment puis-je accéder à l'ID généré lors de l'appel de UserManager.CreateAsync ()?
ÉDITER: Je souhaite que les utilisateurs existants dotés de rôles "administratifs" créent des utilisateurs à partir du système, dans une zone de gestion des utilisateurs. Les réponses ci-dessous expliquent jusqu'ici comment obtenir l'identifiant de l'utilisateur "actuel", ce qui n'est pas ce que je recherche.
L'utilisation de IdentityUser
ou d'une classe héritant de IdentityUser
permet au modèle de disposer d'un attribut UserId
. En utilisant le code suivant, en passant l'utilisateur à la méthode, l'ID sera rempli.
var user = model.GetUser();
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
result = UserManager.AddToRole(user.Id, "User");
La model.GetUser()
renvoie un objet de la ApplicationUser
ou IdentityUser
public ApplicationUser GetUser()
{
var user = new ApplicationUser
{
UserName = UserName,
FirstName = FirstName,
LastName = LastName,
Email = Email,
...
};
return user;
}
La réponse acceptée n’était pas claire pour moi, alors j’ai pensé partager cela.
Si vous consultez source pour la classe IdentityUser , vous trouverez ce qui suit.
public class IdentityUser : IdentityUser<string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim>, IUser, IUser<string>
{
/// <summary>
/// Constructor which creates a new Guid for the Id
/// </summary>
public IdentityUser()
{
this.Id = Guid.NewGuid().ToString();
}
... code omitted
}
Comme vous pouvez le constater, lors de la création d'une nouvelle instance IdentityUser
, le constructeur génère un nouveau GUID et renseigne le champ Id.
Cela signifie que si vous créez une nouvelle instance d'une classe dérivée telle que ApplicationUser
, un nouvel ID sera toujours généré automatiquement pour vous.
Ainsi, après avoir vérifié que l'utilisateur a été ajouté avec succès, vous pouvez utiliser en toute sécurité l'ID de la classe ApplicationUser
pour votre association de données.
Exemple.
var user = new ApplicationUser
{
UserName = "franko",
FirstName = "Frank",
LastName = "Ouimette",
Email = "[email protected]"
};
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded){
result = UserManager.AddToRole(user.Id, "User");
// User added successfully, you can safely use the Id now.
var id = user.Id;
}
Ce qui a fonctionné pour moi était quelque chose de légèrement différent:
var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
var user = new ApplicationUser() { Email = "[email protected]", UserName = "[email protected]" };
var result = manager.Create(user, "TestPass44!");
if (result.Succeeded)
{
string newId = user.Id;
}
Certaines méthodes d'extension ont été ajoutées au cadre d'identité, y compris celui-ci:
public static string GetUserId(this IIdentity identity);
Après avoir effectué la connexion, vous devriez pouvoir récupérer l'ID assez facilement:
await SignInAsync(user, isPersistent: false);
var id = this.User.Identity.GetUserId()
Ce fil a déjà quelques années, mais j'ai rencontré ce problème et je devais trouver une autre solution car je n'utilise pas la variable Guids
fournie, mais un ID entier standard fourni par la base de données (index incrémenté automatiquement).
Le problème que j'ai eu est que si j'ai créé l'utilisateur avec UserManager.CreateAsync
, l'objet utilisateur n'a pas été mis à jour avec l'ID. J'ai ensuite créé un objet associé pour cet utilisateur et, l'ID n'ayant pas été mis à jour, Entity Framework a essayé de sauvegarder l'utilisateur dans la base de données une autre fois, ce qui a entraîné une violation de clé primaire.
Pour résoudre le problème, je devais lire/mettre à jour l'objet utilisateur comme suit:
var user = new User
{
UserName = UserName,
FirstName = FirstName,
LastName = LastName,
Email = Email,
...
};
var result = await UserManager.CreateAsync(user, model.Password);
// At this point, the user has been created, but the ID not set
// Read the full user record from the database
user = db.Users.Where(u => u.Email == user.Email).FirstOrDefault();
// At this point, the user has the correct ID set, we are good to go...