我是ASP.NET Identity框架的新手,我正在尝试做一些我以前在旧的FormsAuthentication框架中做的事情。
我想要做的是允许管理用户使用应用内的现有注册视图(或类似视图)创建新用户。一旦完成,我想关联该用户(可能使用生成的ID)与系统的其他区域。
如何访问调用UserManager.CreateAsync()时生成的ID?
编辑:我希望具有“管理”角色的现有用户在用户管理区域内从系统内创建用户。到目前为止,下面的答案解释了如何获取“当前”用户的ID,而不是我正在寻找的。 p>
答案 0 :(得分:23)
使用IdentityUser
或使用继承自IdentityUser
的类,会使模型具有UserId
属性。使用以下代码,将用户传递给方法,将填充Id。
var user = model.GetUser();
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
result = UserManager.AddToRole(user.Id, "User");
model.GetUser()
会返回ApplicationUser
或IdentityUser
public ApplicationUser GetUser()
{
var user = new ApplicationUser
{
UserName = UserName,
FirstName = FirstName,
LastName = LastName,
Email = Email,
...
};
return user;
}
答案 1 :(得分:14)
我接受的答案并不清楚,所以我想我会分享这个。
如果您查看source课程的IdentityUser,您会发现以下内容。
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
}
如您所见,在创建新的IdentityUser
实例时,构造函数会生成一个新的GUID并填充Id字段。
这意味着如果您创建派生类的新实例,例如ApplicationUser
,则仍会自动为您生成新的ID。
因此,在您检查用户已成功添加后,您可以安全地使用ApplicationUser
类中的ID进行数据关联。
实施例
var user = new ApplicationUser
{
UserName = "franko",
FirstName = "Frank",
LastName = "Ouimette",
Email = "franko@emailservice.com"
};
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;
}
答案 2 :(得分:7)
对我有用的东西略有不同:
var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
var user = new ApplicationUser() { Email = "informatyka4444@wp.pl", UserName = "informatyka4444@wp.pl" };
var result = manager.Create(user, "TestPass44!");
if (result.Succeeded)
{
string newId = user.Id;
}
答案 3 :(得分:4)
Identity框架中添加了一些扩展方法,包括以下方法:
public static string GetUserId(this IIdentity identity);
执行登录后,您应该能够轻松地检索ID:
await SignInAsync(user, isPersistent: false);
var id = this.User.Identity.GetUserId()
答案 4 :(得分:0)
这个帖子已经有几年了,但我遇到了这个问题,需要找到另一个解决方案,因为我不使用提供的Guids
,而是使用数据库提供的标准整数ID(自动递增)索引)。
我遇到的问题是,如果我使用UserManager.CreateAsync
创建了用户,则用户对象未使用ID进行更新。然后,我为该用户创建了一个相关对象,由于ID未更新,Entity Framework尝试将用户另一次保存到数据库,导致主键违规。
要解决这个问题,我需要像这样读取/更新用户对象:
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...
答案 5 :(得分:-2)
如果创建了用户,请添加:
string user = RegisterUser.UserName; or to use later
Session["user"] = RegisterUser.UserName;