简单的 IUserStore,IUserPasswordStore 实现给出了无效的登录尝试

我正在试验 Aspnet Core 2.2,并IdentityUser用我的MyIdentityUser. 当我尝试登录时,我得到“无效的登录尝试”。


为了让我登录,我错过了什么?


该ConfigureServices方法使用 my 设置身份,MyIdentiyUser如下MyIUserStore所示:


services.AddDefaultIdentity<MyIdentityUser>()

    .AddDefaultUI(UIFramework.Bootstrap4)

    .AddUserStore<MyUserStore>();

通过尽可能谨慎地实现所有方法(我从抛出每个方法开始IUserStore,然后实现被调用的方法),我得到了这个:IUserPasswordStoreNotImplementedException


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


阿晨1998
浏览 167回答 1
1回答

婷婷同学_

你返回一个空字符串作为哈希public Task<string> GetPasswordHashAsync(MyIdentityUser user, CancellationToken cancellationToken){&nbsp; &nbsp; return Task.FromResult(string.Empty);}但即使是空密码,也不会产生空的哈希字符串。最重要的是,使用了不同的算法(可以在 Startup.cs 中配置,添加身份时)。如果您希望它成功,您将必须从特定密码返回一个真实的计算哈希,否则它会识别输入的密码返回一个不同的哈希,然后是“存储”的哈希,并导致登录失败。仅仅因为您正在伪造/实现用户存储并不意味着不会执行哈希验证。public Task<string> GetPasswordHashAsync(MyIdentityUser user, CancellationToken cancellationToken){&nbsp; &nbsp; var hash = new PasswordHasher<MyIdentityUser>().HashPassword(user, "asdf");&nbsp; &nbsp; return Task.FromResult(hash)}可以,但请注意,如果您更改密码哈希算法,它可能会失败,因为您正在new使用它,这意味着它使用密码哈希的默认选项。
打开App,查看更多内容
随时随地看视频慕课网APP