ExternalLoginSignInAsync 返回 Failed 响应(当 UserLogin 存在时)



我有一个用MVC、asp.net identity和IdentityServer4构建的 asp.net 核心网站。

我能够在登录谷歌时完成注册过程,并在安全页面中导航。但是,当我注销并尝试使用谷歌登录功能登录时,用于调用var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false);的外部登录回调代码返回Failed响应,就好像我的 aspnetUserLogin 表中不存在该记录一样。

我已经确认了从info.LoginProvider传递的令牌,并且info.ProviderKey与我的 userlogin 表中的值匹配,所以我不确定为什么我会收到Failed响应。

注意:我已经修改了标准的外部注册代码以创建具有emailconfirmed = true值的用户,但我仍然收到上述响应。

为什么当我看到 asp.net 用户登录表中的数据时,这个ExternalLoginSignInAsync方法返回失败?

我会问一些问题,但还没有代表点发表评论。但是,我只是努力解决这个问题(尽管您的特定原因可能不同),以下是我建议采取的一些步骤(对于遇到类似问题的人,而不仅仅是这篇文章):

确保在将用户登录模型映射到表的 DbContext 类中,它如下所示:

modelBuilder.Entity<YourUserLogin>(entity => {
entity.HasKey(e => new { e.LoginProvider, e.ProviderKey });
...
}

这里的顺序很重要,因为它是FindByLoginAsync定位用户登录记录的方式。

之后,检查您的 UserLogin 和 User 类,并确保重写这些属性,假设您是从 Identity 类继承的:

public partial class YourUserLogin : IdentityUserLogin<string>

出于某种原因,当我通过 EF 搭建数据库基架时,它没有覆盖这些字段;这将创建每个字段的副本,一个来自您的类,一个来自继承的类;这会导致属性冲突,Identity 会将这些值视为空。覆盖属性为我解决了这个问题。

一般来说,我建议(如果你使用的是Visual Studio)在你的行var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false);放置一个断点,清除输出,然后按F10并分析输出;你要么看到一个错误,要么看到类似EF生成一个脚本来查找用户where UserId is null(即,如果没有找到UserLogin, 你会看到这个)。然后引用身份 github(因为它是开源的)并按照ExternalLoginSignInAsync采取的各种步骤进行操作;您最终会找到它失败的方法,这将有很大帮助。

希望这有帮助。

相关内容

  • 没有找到相关文章

最新更新