Базовый веб-интерфейс asp.net - преобразование токена «Вход с Apple» в токен Microsoft.AspNetCore.Identity.IdentityResult - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть приложение для 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, используя только электронную почту?

...