Asp.net core Identity 如何使用既有的 AspnetUser 密碼驗證?

主要重點在於密碼的加密機制,因為 .net framework (MVC5) 使用 IdentityV2,其 hash 的加密方式比較不嚴謹,新版的 dotnet core 使用 IdentityV3 更好的 hash 機制,因此兩者不相容。

修改方案如下:

You just have to add this line in ConfigureServices in Startup.cs:

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

來自 <https://stackoverflow.com/questions/47850720/signinmanager-passwordsigninasync-always-return-failure>

補充說明:

_signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false)

這段寫法第一個雖然是用 EMAIL,但實際上 PASSWORD checking 是用 UserName,因此,如果 UserName = Email 就會正確,否則就必須要先讀出 UserName 才可以正確比對。

此外,新的 IdentityV3 一定要使用 NormalizedUserName property 作為登入的 User name(但 UserName 仍然有使用,兩者最大的差異在於 Normalized 一律轉成大寫)。

有問題嗎?歡迎一起討論喔!