我正在试验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
答案 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
正在对其进行加密,这意味着它使用默认的密码哈希选项。