Некоторые мобильные приложения, такие как 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, что не отменяет всех существующих логинов?