Как создать пользователя и получить вновь созданный ID с идентификатором ASP.NET

Я новичок в структуре ASP.NET Identity и пытаюсь сделать некоторые вещи, которые я использовал в старой структуре FormsAuthentication.

Я хочу, чтобы административный пользователь мог создать нового пользователя, используя существующее представление реестра (или подобное) из приложения. Как только это будет завершено, я хотел бы связать с этим пользователем (возможно, с помощью идентификатора, который сгенерирован) в других областях системы.

Как получить доступ к идентификатору, который создается при вызове UserManager.CreateAsync()?

EDIT: Я хочу, чтобы существующие пользователи имели "административные" роли для создания пользователей из системы в области управления пользователями. В приведенных ниже ответах объясняется, как получить идентификатор для "текущего" пользователя, который не является тем, что я ищу.

Ответ 1

Используя 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;
}

Ответ 2

Принятый ответ мне не был понят, поэтому я решил поделиться этим.

Если вы посмотрите источник для 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 для вашей ассоциации данных.

Пример.

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;

}

Ответ 3

Что сработало для меня, было что-то немного другое:

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;
}

Ответ 4

В систему Identity были добавлены некоторые методы расширения, включая этот:

public static string GetUserId(this IIdentity identity);

После выполнения входа вы сможете легко получить идентификатор:

await SignInAsync(user, isPersistent: false);
var id = this.User.Identity.GetUserId()

Ответ 5

Этот поток уже несколько лет, но я столкнулся с этой проблемой и нуждался в поиске другого решения, потому что я не использую предоставленный Guids, а стандартный идентификатор целого числа, предоставляемый базой данных (индекс с автоматическим добавлением).

Проблема, с которой я столкнулся, заключалась в том, что если я создал пользователя с UserManager.CreateAsync, пользовательский объект не был обновлен с идентификатором. Затем я создал связанный объект для этого пользователя, и поскольку идентификатор не был обновлен, 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...

Ответ 6

В случае создания пользователя добавьте:

string user = RegisterUser.UserName; or to use later 
Session["user"] = RegisterUser.UserName;