Простой IUserStore, реализация IUserPasswordStore дает неверную попытку входа - PullRequest
0 голосов
/ 12 декабря 2018

Я экспериментирую с 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 Ответ

0 голосов
/ 13 декабря 2018

Вы возвращали пустую строку как хеш

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

Но даже пустой пароль не приводит к пустой строке хеша.Кроме того, используются разные алгоритмы (которые можно настроить в Startup.cs при добавлении Identity).

Вы должны будете вернуть реальный, вычисленный хеш от определенного пароля, если вы хотите, чтобы он был успешным, в противном случае он распознает введенный пароль, который возвращает другой хеш, чем "сохраненный", и вызовет ошибку при входе в систему.,

То, что вы фальсифицируете / внедряете хранилище пользователей, не означает, что проверки хешей выполняться не будут.

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

Подойдет, хотя имейте в виду, что если вы измените алгоритм хэширования пароля, он может потерпеть неудачу, поскольку вы new его используете, что означает, что он использует параметры по умолчанию для хэширования пароля.

...