5

我有一个使用 IdentityUser 令牌的带有 ASP.NET Core 后端的 iOS 应用程序,并且它可以正常使用用户名/密码登录来检索令牌,如下所示:

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

但是根据我的理解(以及到期),Apple 提供的 IdentityToken 仅打算使用一次并转换为新令牌(在我的情况下为 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?

4

0 回答 0