【问题标题】:How to give custom implementation of UpdateAsync method of asp.net identity?如何自定义实现 asp.net 身份的 UpdateAsync 方法?
【发布时间】:2016-09-01 15:29:04
【问题描述】:

我正在做自定义 asp.net 身份,而不是使用 asp.net 内置表。我已成功创建用户并实现自定义 CreateAsync

现在我想用新的加密密码更新用户,所以我不知道如何提供UpdateAsync method 的自定义实现。

这是我的桌子:

用户Id,Name,EmailId,Password,Statistics,Salary

型号

public class UserModel : IUser 
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string EmailId { get; set; }  
    public string Password { get; set; }
    public int Salary { get; set; }
}

我实现 IUserstore 的自定义类:

public class UserStore : IUserStore<UserModel>, IUserPasswordStore<UserModel>
{
    private readonly MyEntities _dbContext;
    private readonly HttpContext _httpContext;

    // How to implement this method for updating only user password
    public Task UpdateAsync(UserModel user)
    {
        throw new NotImplementedException();
    }

    public Task CreateAsync(UserModel user)
    {
        return Task.Factory.StartNew(() =>
            {
                HttpContext.Current = _httpContext ?? HttpContext.Current;
                var user = _dbContext.User.Create();
                user.Name = user.Name;
                user.EmailId = user.EmailId;
                user.EmailAddress = user.Email;
                user.Password = user.Password;
               _dbContext.Users.Add(dbUser);
               _dbContext.SaveChanges();
            });
    }

    public Task SetPasswordHashAsync(UserModel user, string passwordHash)
    {
        return Task.Factory.StartNew(() =>
            {
                HttpContext.Current = _httpContext ?? HttpContext.Current;
                var userObj = GetUserObj(user);
                if (userObj != null)
                {
                    userObj.Password = passwordHash;
                    _dbContext.SaveChanges();
                }
                else
                    user.Password = passwordHash;
            });
    }

    public Task<string> GetPasswordHashAsync(UserModel user)
    { 
        //other code
    }
}

控制器:

public class MyController : ParentController
{
    public MyController()
        : this(new UserManager<UserModel>(new UserStore(new MyEntities())))
    {
    }

    public UserManager<UserModel> UserManager { get; private set; }

    [HttpPost]
    public async Task<JsonResult> SaveUser(UserModel userModel)
    {
        IdentityResult result = null;
        if (userModel.Id > 0) //want to update user with new encrypted password
            result = await UserManager.UpdateAsync(user);
        else
            result = await UserManager.CreateAsync(userModel.EmailId, userModel.Password);
    }        
}

【问题讨论】:

  • 使用Task.Factory.StartNew 将方法推送到后台线程似乎是个坏主意。要么将方法标记为async 并使用await _dbContext.SaveChangesAsync();,要么使方法同步并在最后返回Task.FromResult(true);
  • 可能。即使不是这样,删除 Task.Factory.StartNew 也可能更容易看到错误。
  • CreateAsync 中还存在变量命名冲突:Task.Factory.StartNew 委托中定义的 user 变量隐藏了 user 参数。但我怀疑这只是您的问题中的一个错字,因为您随后使用了一个名为dbUser 的未定义变量。 :)
  • 我会避免在UpdateAsync 方法中触摸密码 - AFAIK,这仅用于更新 other 属性。 SetPasswordHashAsync 方法用于更新密码。
  • 类似这样的东西:stackoverflow.com/a/37866098/124386

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


【解决方案1】:

不确定这是否是您要找的...

public Task UpdateAsync(UserModel model)
{
    var user = _dbContext.User.Find(x => x.id == model.id);
    user.Password = model.Password;
    _dbContext.SaveChanges();
    return Task.CompletedTask;
}

它将获取特定记录并更新密码,然后保存记录。

编辑

由于密码未加密,我添加了代码以获取该字符串并保持模型不变,此扩展方法将加密密码的值,我尚未对此进行测试,但我相信它会起作用。

 user.Password = model.Password.EncryptPassword(EncryptKey);

Extension methods to encrypt password

【讨论】:

  • 您可以保存模型中的任何值。
  • 但是这里我的问题是密码将被微软身份加密并保存在数据库中还是我的密码将以纯文本形式保存??
  • 这将保存模型内部的值。
  • 在您的保存用户方法中,我会检查用户 ID,然后进行密码转换,然后将该模型发送到您的更新方法。
  • 是的,但我的密码会被散列??
【解决方案2】:

以前,我在 .NET Identity 上创建了一个完整的包装器,可以在 here 找到代码。它可能对你有帮助。您还可以找到 nuget here。我还在博客here 中解释了该库。

【讨论】:

    猜你喜欢
    • 2014-12-04
    • 2018-04-09
    • 2011-03-17
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多