web-dev-qa-db-ja.com

ASP.NET Identity 2のUserManager.Update()によるユーザーの更新

_ASP.NET Identity 2_プロジェクトで_MVC 5_を使用しており、UserManager.Update()メソッドを使用してStudentデータを更新します。ただし、ApplicationUserクラスから継承するため、updateメソッドを呼び出す前にStudentApplicationUserにマッピングする必要があります。一方、新しい生徒の作成にも使用したアプローチを使用すると、更新ではなく新しいインスタンスを作成する際の同時実行によるエラーが発生します。 AutoMapperを使用して問題を解決することに退屈しているので、AutoMapperなしで問題を解決するには安定した修正が必要です。この問題を解決する方法を教えてください。 StudentViewModelをコントローラーのUpdateメソッドに渡し、それをStudentにマップしてから、ApplicationUserとしてUserManager.Update()メソッドに渡す必要があります。一方、セキュリティ上の問題のためにViewに渡すのではなく、Controllerステージでパスワードを取得して送信する必要があるかどうか疑問に思っていますか?この問題についてもお知らせください(ユーザーの更新中はパスワードを更新せず、データベースにユーザーのパスワードを保持する必要があります)。任意の助けをいただければ幸いです。

エンティティクラス:

_public class ApplicationUser : IdentityUser<int, ApplicationUserLogin,
                                     ApplicationUserRole, ApplicationUserClaim>, IUser<int>
{
    public string Name { get; set; }
    public string Surname { get; set; } 
    //code omitted for brevity
}

public class Student: ApplicationUser
{     
    public int? Number { get; set; }
}
_


コントローラー:

_[HttpPost]
[ValidateAntiForgeryToken]
public JsonResult Update([Bind(Exclude = null)] StudentViewModel model)
{
    if (ModelState.IsValid)
    {
        ApplicationUser user = UserManager.FindById(model.Id);

        user = new Student
        {
            Name = model.Name,
            Surname = model.Surname,
            UserName = model.UserName,
            Email = model.Email,
            PhoneNumber = model.PhoneNumber,
            Number = model.Number, //custom property
            PasswordHash = checkUser.PasswordHash
        };

        UserManager.Update(user);
    }
}
_
14
Jack

studentApplicationUserとしてUserManager.Update()メソッドに渡す必要はありません(Studentクラスが継承するため(したがってisApplicationUser)。

コードの問題は、new Student演算子を使用しているため、既存の学生を更新するのではなく、新しい学生を作成することです。

次のようにコードを変更します。

// Get the existing student from the db
var user = (Student)UserManager.FindById(model.Id);

// Update it with the values from the view model
user.Name = model.Name;
user.Surname = model.Surname;
user.UserName = model.UserName;
user.Email = model.Email;
user.PhoneNumber = model.PhoneNumber;
user.Number = model.Number; //custom property
user.PasswordHash = checkUser.PasswordHash;

// Apply the changes if any to the db
UserManager.Update(user);
39
Ivan Stoev

.netcoreに関する私の答え1

私のためにこの仕事、私は彼らを助けることができると思います

var user = await _userManager.FindByIdAsync(applicationUser.Id);
                    user.ChargeID = applicationUser.ChargeID;
                    user.CenterID = applicationUser.CenterID;
                    user.Name  = applicationUser.Name;
var result = await _userManager.UpdateAsync(user);
2
Nilton Alvarez