Проблемы с Identity.TwoFactorRememberMe и обновленным пользователем SecurityStamp - PullRequest
0 голосов
/ 28 февраля 2020

После входа в систему с использованием двухфакторного приложения аутентификации я установил для TrueClient значение true следующим образом:

await _signInManager.TwoFactorAuthenticatorSignInAsync(code: request.Code,
                                                       isPersistent: request.IsPersistent,
                                                       rememberClient: request.RememberClient);

Вход в систему работает нормально, и я получаю файлы cookie .AspNetCore.Identity.Application и Identity.TwoFactorRememberMe. Если я выйду и снова войду, мне не нужно использовать двухфакторный. Пока все в порядке.

Проблема в том, что когда я делаю какие-то изменения в пользователе, например, номер телефона, и изменяется SecurityStamp. После внесения изменений я использую await _signInManager.RefreshSignInAsync(user). Но Identity.TwoFactorRememberMe cook ie не обновляется. Это приводит к двум проблемам:

  1. При следующем входе в систему мне придется снова использовать двухфакторную аутентификацию.
  2. Если во время того же сеанса я проверю, есть ли у пользователя запомнил браузер, используя await _signInManager.IsTwoFactorClientRememberedAsync(user), это приведет к ошибке «Не удалось проверить штамп безопасности» и .AspNetCore.Identity.Application будет удалено.

Я пытался обновить Identity.TwoFactorRememberMe cook ie одновременно с .AspNetCore.Identity.Application cook ie, вот так:

await base.RefreshSignInAsync(user);
await RememberTwoFactorClientAsync(user);

Работает, но также установит Identity.TwoFactorRememberMe cook ie для тех, кто не было этого раньше. Я не могу проверить, установлен ли он раньше, потому что тогда я получаю ошибку, которую я описал в (2) выше.

Следующее, что я попытаюсь сделать, - это делать что-то подобное для каждого места, где я делаю что-то, что изменяет пользователя SecurityStamp:

var isTwoFactorClientRemembered = await _signInManager.IsTwoFactorClientRememberedAsync(user);

// do the changes...

await _signInManager.RefreshSignInAsync(user);
if (isTwoFactorClientRememberedAsync)
    await _signInManager.RememberTwoFactorClientAsync(user);

Есть ли что-то, чего мне здесь не хватает, или это единственный способ go?

Я использую IdentityServer4 и приложение SPA, но я не верю, что это как-то связано с этой проблемой.

1 Ответ

0 голосов
/ 01 марта 2020

Я закончил тем, что добавил метод в свой собственный ApplicationSignInManager:

public async Task<TResult> KeepSignInAsync<TResult>(ApplicationUser user, Func<Task<TResult>> func)
{
    var isTwoFactorClientRemembered = await IsTwoFactorClientRememberedAsync(user);

    var result = await func();

    await RefreshSignInAsync(user);

    if (isTwoFactorClientRemembered)
        await RememberTwoFactorClientAsync(user);

    return result;
}

Когда я изменяю что-то, что обновит пользовательский SecurityStamp, я использую его так:

var result = await _signInManager.KeepSignInAsync(user, () => _userManager.SetPhoneNumberAsync(user, phoneNumber));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...