将我的应用程序从.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返回失败的确切原因?
答案 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
);