SignInManager.PasswordSignInAsync始终返回失败

时间:2017-12-16 23:02:35

标签: asp.net-mvc asp.net-identity asp.net-core-2.0

将我的应用程序从.NET Framework 4.6转换为.NET Core 2后,我对数据库进行了所请求的更改,以支持新的身份模型,即添加到AspNetUsers和新表的几个字段。

日志在.NET Core中运行良好。

现在我需要回到.NET Framework 4.6应用程序,当我尝试登录时,SignInManager.PasswordSignInAsync始终返回Failure。 我使用SQL事件探查器检查了查询,但我看不到任何错误的查询(在运行的任何查询中都没有错误。)

CREATE TABLE [dbo].[AspNetUsers](
    [Id] [nvarchar](128) NOT NULL,
    [UserKeyId] [bigint] NOT NULL,
    [Email] [nvarchar](256) NULL,
    [EmailConfirmed] [bit] NOT NULL,
    [PasswordHash] [nvarchar](max) NULL,
    [SecurityStamp] [nvarchar](max) NULL,
    [PhoneNumber] [nvarchar](max) NULL,
    [PhoneNumberConfirmed] [bit] NOT NULL,
    [TwoFactorEnabled] [bit] NOT NULL,
    [LockoutEndDateUtc] [datetime] NULL,
    [LockoutEnabled] [bit] NOT NULL,
    [AccessFailedCount] [int] NOT NULL,
    [UserName] [nvarchar](256) NOT NULL,
    [CreationDate] [datetimeoffset](7) NOT NULL DEFAULT ('1900-01-01T00:00:00.000'),
    [FirstName] [nvarchar](max) NULL,
    [LastName] [nvarchar](max) NULL,
    [NormalizedEmail] [nvarchar](256) NULL,
    [NormalizedUserName] [nvarchar](256) NULL,
    [ConcurrencyStamp] [nvarchar](max) NULL,
    [LockoutEnd] [datetimeoffset](7) NULL,
 CONSTRAINT [PK_dbo.AspNetUsers] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

失败的地方(即结果= SignInStatus.Failure):

var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: true);

在AspNetUsers表中:Email = UserName

我认为我不需要回滚对数据库所做的更改,因此如何找出PasswordSignInAsync返回失败的确切原因?

1 个答案:

答案 0 :(得分:2)

问题在于哈希。 使用.NET Framework 4.6中的旧应用程序,它使用的是Identity 2.0。 当我将我的应用程序转换为.NET Core 2时,我实际上创建了一个新项目并按文件迁移了代码文件,因此它使用了更强大的Identity 3.0。作为一个不太好的功能,哈希在您登录时被重写,因此密码哈希值被Identity 3.0重写,我的旧应用程序无法解码。

但是有一个选项可以设置.NET Core以防止使用Identity 3.0。

您只需在Startup.cs中的ConfigureServices中添加此行:

services.Configure<PasswordHasherOptions>(options =>
    options.CompatibilityMode = PasswordHasherCompatibilityMode.IdentityV2
);