我目前正在使用这本出色的指南,目的是将使用SQL成员身份验证的现有Web应用程序迁移到ASP.NET身份验证:
由于差异我没有使用Web窗体项目,所以我已经调整它以使用MVC 5项目。这是我的UserManager类,它应该检查SQL成员资格密码并在必要时更新它们(详见上面的链接):
public class MyUserManager : UserManager<ApplicationUser>
{
public MyUserManager()
: base(new UserStore<ApplicationUser>(new ApplicationDbContext()))
{
this.PasswordHasher = new SQLPasswordHasher();
}
public class SQLPasswordHasher : PasswordHasher
{
public override string HashPassword(string password)
{
return base.HashPassword(password);
}
public override PasswordVerificationResult VerifyHashedPassword(string hashedPassword, string providedPassword)
{
string[] passwordProperties = hashedPassword.Split('|');
[SNIP]
问题 / Account / Login方法似乎没有使用PasswordHasher扩展名。这是代码(直接来自MVC 5模板,尽管UserManager对象是上面MyUserManager类的一个实例):
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid)
{
var user = await UserManager.FindAsync(model.UserName, model.Password);
if (user != null)
{
await SignInAsync(user, model.RememberMe);
return RedirectToLocal(returnUrl);
}
else
{
ModelState.AddModelError("", "Invalid username or password.");
[SNIP]
它不会进行身份验证。我想我不是唯一一个试图做这项工作的人。有什么指针吗?对于MVC 5,我是否需要编写不同的扩展名?
感谢您提供的任何帮助。
答案 0 :(得分:3)
以下是为新的MVC 5项目设置的方法:
<强> IdentityModels.cs 强>
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("ApplicationServices")
{
}
}
public class MyUserManager : UserManager<ApplicationUser>
{
public MyUserManager()
: base(new UserStore<ApplicationUser>(new ApplicationDbContext()))
{
this.PasswordHasher = new SQLPasswordHasher();
}
public class SQLPasswordHasher : PasswordHasher
[etc.]
可以找到SQLPasswordHasher代码here。
<强> AccountController.cs 强>
public class AccountController : Controller
{
public AccountController()
: this(new MyUserManager())
{
}
public AccountController(MyUserManager userManager)
{
UserManager = userManager;
}
public MyUserManager UserManager { get; private set; }
[etc.]
其余部分与上面提到的博客和/或默认MVC 5模板中显示的完全相同。一旦连接到具有SQL成员资格信息的上下文,它就像一个魅力。希望这会有所帮助。