2017-12-16 14 views
0

.NET Framework 4.6から.NET Core 2にアプリケーションを変換した後、新しいIDモデルをサポートするためにデータベースに変更を加えました。つまり、いくつかのフィールドがAspNetUsersと新しいテーブルに追加されました。SignInManager.PasswordSignInAsyncは常にエラーを返す

ログは.NETコアで正常に動作します。

.NET Framework 4.6アプリケーションに戻る必要があります。ログインしようとすると、SignInManager.PasswordSignInAsyncは常に失敗を返します。 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):

AspNetUsersテーブルで
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: true); 

:メール=ユーザー名

私はに加えられた変更をロールバックする必要はないと思いますDBのため、PasswordSignInAsyncが失敗を返す正確な理由をどのように見つけることができますか?

答えて

0

問題はハッシュであった。 .NET Framework 4.6の古いアプリケーションでは、Identity 2.0を使用していました。 私のアプリケーションを.NET Core 2に変換したとき、私は実際に新しいプロジェクトを作成し、ファイルごとにコードを移行したので、より強力なIdentity 3.0を使用しました。それほどいいことではない機能として、ログイン時にハッシュが書き直されるので、パスワードハッシュはアイデンティティ3.0で書き直されました。私の古いアプリはそれを解読できませんでした。

ただし、Identity 3.0を使用しないように.NET Coreを設定することもできます。

あなただけStartup.csでConfigureServicesにこの行を追加する必要があります。

services.Configure<PasswordHasherOptions>(options => 
    options.CompatibilityMode = PasswordHasherCompatibilityMode.IdentityV2 
); 
関連する問題