У меня есть приложение для iOS с бэкэндом ASP.NET Core, использующим токены IdentityUser, и оно нормально работает с именем пользователя / паролем для получения токена следующим образом:
var result = await _signInManager.PasswordSignInAsync(model.Username, model.Password, isPersistent: true, lockoutOnFailure: true);
if (result.Succeeded)
{
return Ok(result);
}
Но теперь я бы хотелдобавьте опцию «Войти через Apple», что легко сделать на стороне приложения, и после того, как Apple проверит пользователя, мы получим IdentityToken (JWT), который подписан и содержит адрес электронной почты.Это кажется простым, и я могу передать IdentityToken обратно в мой API и проверить его действительность, проверив подпись, используя: https://stackoverflow.com/a/34423434/1999217
Но, насколько я понимаю (и истекает срок действия), IdentityToken, предоставленный Apple, предназначен только длябыть использованным один раз и преобразованным в новый токен (токен Microsoft.AspNetCore.Identity в моем случае).
Как этого добиться?После того, как я проверил IdentityToken, и я доверяю, что запрашивающий пользователь владеет переданным адресом электронной почты, я могу получить ApplicationUser и Microsoft.AspNetCore.Identity.UserManager, по-видимому, имеет метод SignInAsync (), но его тип возвращаемого значения не IdentityResult какожидается, что это бесполезно.
Я также рассмотрел методы ExternalLoginProvider, но он использует обратные вызовы, которые, как мне кажется, не подходят в этой ситуации, поскольку у меня есть токен, которому я могу доверять.
Я думаю о том, чтобы взять адрес электронной почты и сделать мгновенный сброс пароля, но это кажется изворотливым.Примерно так:
var user = await _userManager.FindByEmailAsync(email);
var token = await _userManager.GeneratePasswordResetTokenAsync(user);
var result = await _userManager.ResetPasswordAsync(user, token, RandomPassword());
Поскольку это связано с аутентификацией, я чувствую, что лучше быть в безопасности, чем сожалеть.Я думаю, что орех моего вопроса будет: Это хитроумно?Есть ли лучший способ получить IdentityResult, используя только электронную почту?