代码之家  ›  专栏  ›  技术社区  ›  LosManos

简单的IUserStore、IUserPasswordStore实现提供了无效的登录尝试

  •  1
  • LosManos  · 技术社区  · 7 年前

    我正在试验Aspnet Core 2.2,并已取代标准 IdentityUser MyIdentityUser . 当我尝试登录时,我得到“无效登录尝试”

    为了允许我登录,我错过了什么?


    这个 ConfigureServices MyIdentiyUser MyIUserStore 像这样:

    services.AddDefaultIdentity<MyIdentityUser>()
        .AddDefaultUI(UIFramework.Bootstrap4)
        .AddUserStore<MyUserStore>();
    

    通过实施所有 IUserStore IUserPasswordStore 方法尽可能少(我从每种方法开始 NotImplementedException 然后实施那些被称为)我做到了:

    public class MyUserStore : IUserStore<MyIdentityUser>, IUserPasswordStore<MyIdentityUser>
    {
        public void Dispose() { }
    
        public Task<MyIdentityUser> FindByNameAsync(string normalizedUserName, CancellationToken cancellationToken)
        {
            var ret = new MyIdentityUser
            {
                Id = "1",
                UserName = normalizedUserName
            };
            return Task.FromResult(ret);
        }
    
        public Task<string> GetUserIdAsync(MyIdentityUser user, CancellationToken cancellationToken)
        {
            return Task.FromResult(user.UserName);
        }
    
        public Task<string> GetPasswordHashAsync(MyIdentityUser user, CancellationToken cancellationToken)
        {
            return Task.FromResult("asdf");
        }
        ... the rest of the methods throws exception.
    }
    

    MyIdentityUser

    public class MyIdentityUser
    {
        public string Id {get;set;}
        public string UserName {get;set}
    }
    

    开始 _LoginPartial.cshtml

    @using Microsoft.AspNetCore.Identity
    @inject SignInManager<MyIdentityUser> SignInManager
    @inject UserManager<MyIdentityUser> UserManager
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Tseng    7 年前

    public Task<string> GetPasswordHashAsync(MyIdentityUser user, CancellationToken cancellationToken)
    {
        return Task.FromResult(string.Empty);
    }
    

    如果要成功,您必须从特定密码返回一个真实的、计算过的哈希值,否则它将识别输入的密码返回的哈希值与“存储”的哈希值不同,并导致登录失败。

    仅仅因为您伪造/实现了用户存储,并不意味着不会执行哈希验证。

    public Task<string> GetPasswordHashAsync(MyIdentityUser user, CancellationToken cancellationToken)
    {
        var hash = new PasswordHasher<MyIdentityUser>().HashPassword(user, "asdf");
        return Task.FromResult(hash)
    }
    

    不过,请注意,如果更改密码哈希算法,它可能会失败,因为您 new 这意味着它使用默认的密码哈希选项。

    推荐文章