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

时间:2018-12-12 20:26:12

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

我正在试验Aspnet Core 2.2,并用我的IdentityUser代替了标准MyIdentityUser。当我尝试登录时,出现“无效的登录尝试”。

我想实现登录遗漏了什么?


ConfigureServices方法使用我的MyIdentiyUserMyIUserStore设置身份,如下所示:

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

通过尽可能少地实现所有IUserStoreIUserPasswordStore方法(我从抛出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 个答案:

答案 0 :(得分:1)

您正在返回一个空字符串作为哈希值

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

但是,即使密码为空,也不会导致哈希字符串为空。最重要的是,使用了不同的算法(可以在添加Identity时在Startup.cs中对其进行配置)。

如果您希望成功,则必须从特定密码返回真实的,计算得出的哈希值,否则它将识别输入的密码返回的哈希值不同于“已存储”的哈希值,并且将导致登录失败。

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

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

将这样做,但是请注意,如果您更改密码哈希算法,则可能会失败,因为您new正在对其进行加密,这意味着它使用默认的密码哈希选项。