如何创建用户并使用ASP.NET标识获取新创建的ID

时间:2014-01-26 22:07:39

标签: c# asp.net asp.net-mvc-5 asp.net-identity

我是ASP.NET Identity框架的新手,我正在尝试做一些我以前在旧的FormsAuthentication框架中做的事情。

我想要做的是允许管理用户使用应用内的现有注册视图(或类似视图)创建新用户。一旦完成,我想关联该用户(可能使用生成的ID)与系统的其他区域。

如何访问调用UserManager.CreateAsync()时生成的ID?

编辑:我希望具有“管理”角色的现有用户在用户管理区域内从系统内创建用户。到目前为止,下面的答案解释了如何获取“当前”用户的ID,而不是我正在寻找的。

6 个答案:

答案 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()会返回ApplicationUserIdentityUser

的对象
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;