Asp.Net Identity - SetPasswordHashAsync不工作

时间:2015-02-23 16:11:05

标签: asp.net-mvc asp.net-identity identity asp.net-identity-2 ef-database-first

我陷入了类似这样的情景。

我正在使用我的新 MVC 应用程序实施 Identity 2.0 。我想使用用户ID 用户ID 作为 int

为实现这一目标,我创建了

  • 自定义用户存储 - MyUserStore

     public class MyUserStore : IUserLoginStore<AspNetUser>, IUserClaimStore<AspNetUser>, IUserRoleStore<AspNetUser>, IUserPasswordStore<AspNetUser>, IUserSecurityStampStore<AspNetUser>, IUserStore<AspNetUser>, IDisposable //where AspNetUser : AspNetUser
        {
            private readonly DemoPermissionDBContext _context;
            //private readonly Func<string, string> _partitionKeyFromId;
    
            public MyUserStore(DemoPermissionDBContext dbContext)
            {
                _context = dbContext;
            }
    
            public Task SetPasswordHashAsync(AspNetUser user, string passwordHash)
            {
                user.PasswordHash = passwordHash;
                return Task.FromResult(0);
            }
    
            //And other methods implementation
         }
    

此处 AspNetUser 是由EF生成的用户类,我将其继承自Identity.IUser

  • 自定义用户管理器 - AppUserManager

         public class AppUserManager : Microsoft.AspNet.Identity.UserManager<AspNetUser>
         {
              MyUserStore _store = null;
    
              public AppUserManager(MyUserStore store) : base(store)
              {
                   _store = store;
              }
    
         }
    
  • 自定义密码哈希 - MyPasswordHasher

    public class MyPasswordHasher : IPasswordHasher
    {
        public string HashPassword(string password)
        {
            return password;
        }
    
        public PasswordVerificationResult VerifyHashedPassword(
          string hashedPassword, string providedPassword)
        {
            if (hashedPassword == HashPassword(providedPassword))
                return PasswordVerificationResult.Success;
            else
                return PasswordVerificationResult.Failed;
        }
     }
    
  • 自定义声明Prinicipal - AppClaimsPrincipal

     public class AppClaimsPrincipal : ClaimsPrincipal
     {
          public AppClaimsPrincipal(ClaimsPrincipal principal):base(principal)
          { 
    
          }
    
          public int UserId
          {
              get { return int.Parse(this.FindFirst(ClaimTypes.Sid).Value);
          }
     }
    

    现在,当我注册用户时, UserManager.CreateAsync 应该在将用户实际保存到数据库之前自动调用 SetPasswordHashAsync 。同时,正确调用 SetSecurityStampAsync

我在AccountController中的操作是这样的,

public AppUserManager UserManager { get; private set; }

public AccountController(AppUserManager userManager)
{
    this.UserManager = userManager;
    this.UserManager.PasswordHasher = new MyPasswordHasher();

}

这就是我如何为用户表和数据库第一种方法实现用户int主键的身份。

问题:

当我的用户插入数据库时​​,它没有包含密码哈希。该记录具有空密码哈希。当我调试代码时,我发现不会仅调用 SetPasswordHashAsync 。它没有执行menthod。什么应该导致这个问题?我已经逐行检查了整个代码但没有成功。在web.config中是否需要添加任何内容以使用自定义密码hasher?

我不确定我是否遗漏了什么。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

我没有看到你在userManager中设置MyPasswordHasher。添加

this.PasswordHasher = new MyPasswordHasher();

AppUserManager的构造函数中。

此外,您无需覆盖ClaimsPrincipal即可获取UserId。这可以通过User.Identity.GetUserId()命名空间中的Microsoft.AspNet.Identity获得。

此外,我发现在IPrincipal上使用扩展方法更容易获取声明的值 - 比使用自定义主体类型更容易。

答案 1 :(得分:0)

应调用 steve16351 所述的UserManager.CreateAsync(user, password)而不是UserManager.CreateAsync(user)

我最近遇到了与您完全相同的问题,并用UserManager.CreateAsync(user, password)解决了这个问题。