Подтвердить что ты не робот

Одноразовая ссылка для входа в asp.net identity

Некоторые мобильные приложения, такие как slack, популяризировали идею разрешить пользователям получать одноразовые ссылки для входа в систему (Slack называет эту магическую ссылку для входа в систему).

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

Я реализую это в asp.net identity 2.1, и я не уверен, как обеспечить, чтобы созданная ссылка могла использоваться только один раз.

Я генерирую токен следующим образом:

var token = await _userManager.GenerateUserTokenAsync("MyLoginLink",user.Id);

Этот токен добавляется к URL-адресу для пользователя. Метод действия, по которому ссылка перенаправляет вас на проверку того, что ссылка действительна для этого пользователя, а затем регистрирует вас:

public async Task<ActionResult> LoginLink(string email, string token)
{

    var user = await _userManager.FindByNameAsync(email);

    // some checks ommited

    //check for an expired token:
    var result = await _userManager.VerifyUserTokenAsync(user.Id, "MyLoginLink", token);
    if (!result)
    {
        // Failed
        return RedirectToAction("Login");
    }

    await _userManager.UpdateSecurityStampAsync(user.Id);
    await SignInAsync(user, true);

Теперь - если я обновляю штамп безопасности с помощью user.UpdateSecurityStamp, который повторно создает штамп безопасности, что приведет к недействительности этого токена и гарантирует его повторное использование. Проблема заключается в том, что он также аннулирует любые существующие логины, поэтому, если пользователь также зарегистрирован на рабочем столе, они будут вынуждены выйти из системы и снова включить.

Существует ли относительно простой способ создания одноразового использования токена, подобного этому в идентификаторе asp.net, что не отменяет всех существующих логинов?

4b9b3361