В прошлом году я сделал собственный магазин IUserPasswordStore для клиента. В этом решении задействован Microsoft.AspNetCore.Identity.UserManager, который обрабатывает хеширование паролей за кулисами, никакой специальной обработки паролей не требуется. Вы будете нести ответственность за хранение хешированного пароля в базе данных вместе с другими свойствами пользователя.
Я не могу опубликовать sh код целиком, это не моя собственность, но я могу набросать основные части.
Во-первых, нам нужен IdentityUser:
public class AppIdentityUser : IdentityUser<int>
{
public string Name { get; set; }
}
Затем реализация if IUserPasswordStore
public class UserPasswordStore : IUserPasswordStore<AppIdentityUser>
{
private readonly IUserRepo _userRepo; // your custom user repository
private readonly IdentityErrorDescriber _identityErrorDescriber;
public UserPasswordStore(IUserRepo userRepo, IdentityErrorDescriber identityErrorDescriber)
{
_userRepo = userRepo;
_identityErrorDescriber = identityErrorDescriber;
}
public Task<IdentityResult> CreateAsync(AppIdentityUser user, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
if (user == null)
{
throw new ArgumentNullException(nameof(user));
}
// if email exists, fail
if (_userRepo.GetByEmailAddress(user.Email) != null)
{
return Task.FromResult(IdentityResult.Failed(_identityErrorDescriber.DuplicateEmail(user.Email)));
}
// ... convert AppIdentityUser to model class
//
_userRepo.Save(userModel);
return Task.FromResult(IdentityResult.Success);
}
... implementation of the rest of IUserPasswordStore<AppIdentityUser> comes here
}
Вставьте это в код для CRUD-операций пользователя, например, контроллер управления пользователями :
UserManager<AppIdentityUser>
Пример кода для смены пароля (извините за вложение)
var result = await _userManager.RemovePasswordAsync(identityUser);
if (result.Succeeded)
{
result = await _userManager.AddPasswordAsync(identityUser, model.Password);
if (result.Succeeded)
{
var updateResult = await _userManager.UpdateAsync(identityUser);
if (updateResult.Succeeded)
{
... do something
}
}
}
Вставьте это в LoginController:
SignInManager<AppIdentityUser>
Нам также нужна реализация
IRoleStore<IdentityRole>.
Если авторизация не требуется, оставьте все методы пустыми.
В Startup # ConfigureServices:
services.AddIdentity<AppIdentityUser, IdentityRole>().AddDefaultTokenProviders();
services.AddTransient<IUserStore<AppIdentityUser>, UserPasswordStore>();
services.AddTransient<IRoleStore<IdentityRole>, RoleStore>();
services.Configure<CookiePolicyOptions>(options => ...
services.Configure<IdentityOptions>(options => ...
services.ConfigureApplicationCookie(options => ...
В Startup # Configure:
app.UseCookiePolicy();
app.UseAuthentication();
app.UseAuthorization();
См. Также https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity-custom-storage-providers?view=aspnetcore-3.1