SignInManager.ExternalLoginSignInAsync无法登录用户

8
在ASP.NET Core和OAuth中,与ASP.NET身份验证相关的,在登录回调中有以下片段代码:
var info = await _signInManager.GetExternalLoginInfoAsync();
if (info == null)
{
    return RedirectToAction(nameof(Login));
}

var result = await _signInManager.ExternalLoginSignInAsync(
    info.LoginProvider,
    info.ProviderKey,
    isPersistent: true);

if (result.Succeeded)
{
    // ...

由于某种原因,result 总是返回状态 Failed,尽管我已经成功登录到外部提供程序(显然,因为刷新外部页面后我会看到自己已登录)。除了登录尝试失败之外,我所拥有的唯一信息是 不是 因为任何 IsLockedOutRequiresTwoFactorIsNotAllowed,因为这些标志在 result 对象上也是 false。如何获取更多有关发生了什么错误的信息?
更新:根据 @Dmitry 的建议,我启用了相当激进的日志记录,但我仍然无法找到任何有价值的东西。在成功获取 info 和随后的登录尝试失败之间,我在日志中唯一得到的东西是来自我的 db 上下文的以下内容:
2017-07-04T22:45:14.2847287+02:00 0HL633KNRMVO7 [INF] Executed DbCommand (1ms) [Parameters=[@__get_Item_0='?' (Size = 450), @__get_Item_1='?' (Size = 450)], CommandType='Text', CommandTimeout='30'] SELECT TOP(1) [e].[LoginProvider], [e].[ProviderKey], [e].[ProviderDisplayName], [e].[UserId] FROM [AspNetUserLogins] AS [e] WHERE ([e].[LoginProvider] = @__get_Item_0) AND ([e].[ProviderKey] = @__get_Item_1) (6438bdd5)
在 MSSQL Management Studio 中执行此操作,我得到了一个空结果集,我怀疑这可能是一个问题,但我不知道为什么或如何修复它。非常感谢您的帮助。

启用调试日志并检查日志。 - Dmitry
@Dmitry,能否详细说明如何做到这一点?我在哪里配置日志记录?日志输出最终会出现在哪里? - Tomas Aschan
当您使用外部提供程序登录时,该登录成功是否被记录在数据库中?我暂时想不起表名,但是Identity表之一将包含该提供程序的身份验证信息以及用户的Id列。如果该表为空,则可能仅仅是因为您的凭据无法访问该表/数据库进行写入。这可能有点冒险,但由于现在没有其他线索,值得一试。此时我唯一能建议的另一件事是为Identity生成PBD并逐步执行该代码。 - Bagzli
@Bojan:除了AspNetUsers之外,所有与ASP.NET Identity相关的表都是空的。如果我理解正确的话,其中一个表(AspNetUserLogins?)应该有一行记录成功登录的信息,对吗?我没有这样的记录是否表示在登录时或配置时出现错误? - Tomas Aschan
2个回答

16

-1

你的 Startup.cs 文件中包含一个名为 Configure(...) 的方法,其中在前几行中有类似于 loggerFactory.AddConsole(...) 的内容。

日志配置可以在代码中设置或从配置文件(appsettings.json)中读取 - 这取决于你的项目。

检查你当前的日志配置并将级别设置为 Debug。然后重新启动应用程序并在登录时检查控制台输出。

文档:ASP.NET 中的日志记录介绍


谢谢。日志提供了一些信息,但不是很多;请看我的更新。 - Tomas Aschan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接