Простой обмен для использования usr / pwd из другого бэкэнда в Aspnetcore2.2 - PullRequest
0 голосов
/ 19 января 2019

Как мне создать простое решение aspnetcore (2.2) +, которое использует бэкэнд только для аутентификации пользователей?

Я не должен управлять пользователями, и я могу указать API, поэтому он должен иметь, надеюсь, только 1 метод IsAuthenticated(email,password).

Я начал с плиты котла

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

с самой простой из возможных реализаций
MyIdentityUser и
MyUserStore : IUserStore<MyIdentityUser>, IUserPasswordStore<MyIdentityUser>, IUserEmailStore<MyIdentityUser>
но он делает слишком много, как я должен был делать (поддельные) реализации FindByNameAsync, GetPasswordHashAsync, GetUserIdAsync, GetUserNameAsync и более.

Я думаю виноват именно метод AddDefaultIdentity (ну ... я действительно виноват, поскольку я все еще считаю себя превосходящим компьютеры) как Я предполагаю, что «По умолчанию» в имени метода означает, что у меня будет бэкэнд, который управляет всем.

Я прочитал MSDN: Введение в идентификацию в ASP.NET Core и Настройка идентификации ядра ASP.NET , но они слишком ориентированы на замену EF-and-everything или моего Reading-Docs-skillz не достаточно хороши. Точно так же я искал в интернете, но, похоже, мой гугл-фу недостаточно силен.

UPDATE

Не упомянутое выше, мне особенно пришлось реализовать GetPasswordHashAsync, который должен возвращать тот же алгоритм хеширования, который используется при хешировании пользовательского ввода (viewmodel). Если я могу переопределить этот алгоритм хеширования, я могу либо отправить простой текст на сервер (хмм), либо попросить алгоритм и реализовать его сам (лучше).
В настоящее время GetPasswordHashAsync должен возвращать хеш в специальном формате с ведущим символом, указывающим, какой из двух алгоритмов использовался.

Является ли решение переопределить (как) алгоритм, используемый для модели представления? Если да, то как?
Я вижу статьи о настройке нового PasswordHasher для UserManager, но не могу понять, как ввести его в поток.

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Функция signInManager.PasswordSignInAsync принимает имя пользователя и пароль и регистрирует вас в системе. Требуется еще два поля (bools), первое - «постоянное», которое вы можете пометить как ложное в вашем случае, а второе - блокировка. Возвращает SignInResult, который затем можно использовать для проверки успешности входа в систему с помощью result.Succeeded.

var result = signInManager.PasswordSignInAsync(username, pass, true, true);
return result.Succeeded;
0 голосов
/ 27 января 2019

Я думаю, что IUserPasswordStore не несет ответственности за хэширование пароля, поэтому вам не нужно помещать туда свой алгоритм хэширования. Ответственность IUserPasswordStore заключается только в том, чтобы установить и получить хешированный пароль от пользователя Identity (MyIdentityUser).

Взгляните на реализацию GetPasswordHashAsync в UserStoreBase, просто верните user.PasswordHash, вот и все.

https://github.com/aspnet/AspNetCore/blob/bfec2c14be1e65f7dd361a43950d4c848ad0cd35/src/Identity/Extensions.Stores/src/UserStoreBase.cs

То есть, если вы реализуете IUserPasswordStore, это не значит, что у вас должен быть свой собственный хэш пароля.

Ответственный за хеширование пароля - IPasswordHasher. Если вы хотите иметь свой собственный хэш-пароль, вы можете реализовать его самостоятельно.

    public class MyPasswordHasher : IPasswordHasher<MyIdentityUser>
    {
        public string HashPassword(MyIdentityUser user, string password)
        {
            ...
        }

        public PasswordVerificationResult VerifyHashedPassword(MyIdentityUser user, string hashedPassword, string providedPassword)
        {
            ...
        }
    }

Хэш-пароль по умолчанию вы можете найти здесь,

https://github.com/aspnet/AspNetCore/blob/bfec2c14be1e65f7dd361a43950d4c848ad0cd35/src/Identity/Extensions.Core/src/PasswordHasher.cs

И зарегистрируйте его для DI в файле startup.cs, чтобы UserManager использовал ваш собственный хэш-пароль. Или, другими словами, это добавит ваш хэш-пароль в поток.

services.AddScoped<IPasswordHasher<MyIdentityUser>, MyPasswordHasher>();

А также взгляните на класс UserManager, здесь взаимодействуют IUserPasswordStore и IPasswordHasher. Внутри UserManager вы найдете следующий код

passwordStore.SetPasswordHashAsync(user, PasswordHasher.HashPassword(newPassword)).WithCurrentCulture();
...