Изменение ядра Asp .net требует перезапуска приложения - PullRequest
0 голосов
/ 26 апреля 2018

Я запускаю свое приложение, захожу в систему и меняю свой пароль (я использую идентификационную информацию net .core по умолчанию):

IdentityResult identityResult = 
                await _userManager.ChangePasswordAsync(
                     applicationUser, 
                     model.CurrentPassword, 
                     model.NewPassword);

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

Затем я выхожу из системы и пытаюсь войти с новым паролем. Но

if (await _userManager.CheckPasswordAsync(user, password))

возврат false. (Вход в систему со старым паролем все еще работает, и я ничего не кеширую)

Когда я перезагружаю свое приложение и пытаюсь войти в систему с новым паролем, оно работает. Я думаю, это где-то проблема с этим PasswordStore (есть ли кеширование?)? Любые другие предложения, которые я, возможно, забыл или почему это не работает?

редактирование:

метод полного изменения пароля:

[HttpPut]
[Route("api/user/changepassword/{ident}")]
public async Task<bool> ChangePassword(int ident, [FromBody]ChangePasswordModel model)
{
    if (!ModelState.IsValid)
        return false;

    ApplicationUser applicationUser;

    if ((applicationUser = await _userManager.FindByIdAsync(ident.ToString())) == null)
        return false;

    IdentityResult identityResult = await _userManager.ChangePasswordAsync(applicationUser, model.CurrentPassword, model.NewPassword);
    return identityResult.Succeeded;
}

часть моего стартапа.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<ApplicationUser, ApplicationRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

1 Ответ

0 голосов
/ 07 мая 2018

Так что, я думаю, AspNetCores UserManager<TUser> кэширует данные (и я думаю, что они кэшируются в PasswordStore? Пожалуйста, исправьте меня, если не так).

Я мог бы это исправить, получив новый UserManager<TUser> -объект при проверке пароля в промежуточном программном обеспечении tokenprovider.

private async Task _generateToken(HttpContext context)
{
    StringValues username = context.Request.Form["username"];
    StringValues password = context.Request.Form["password"];

    var usermanager = context.RequestServices.GetRequiredService<UserManager<ApplicationUser>>();

    ApplicationUser user = await usermanager.FindByNameAsync(username);

    if (user == null)
    {
        context.Response.StatusCode = StatusCodes.Status400BadRequest;
        await context.Response.WriteAsync("Invalid username or password.");
        return;
    }

    ClaimsIdentity identity = await _getIdentity(user, password);

    if (identity == null)
    {
        await usermanager.AccessFailedAsync(user);

        context.Response.StatusCode = StatusCodes.Status400BadRequest;
        await context.Response.WriteAsync("Invalid username or password.");
        return;
    }

Я могу создать новый UserManager<TUser> с помощью следующего метода расширения:

var usermanager = context.RequestServices.GetRequiredService<UserManager<TUser>>();

при проверке пароля мы теперь проверяем новые данные, и новый пароль правильный (а предыдущий пароль неверный).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...