【发布时间】:2014-02-27 06:26:22
【问题描述】:
我正在开发一个 ASP.NET Web 表单项目,该项目具有一个行为异常的用户存储库实现。我遇到以下行为:
- 用户使用有效的用户名/密码登录。他们成功进入。
- 用户退出。
- 我更改了数据库中的密码(为了论证)。
- 用户使用新密码再次登录。但是,登录被视为无效而被拒绝。
如果我在 ValidateUser() 方法中的“用户”变量处设置断点并检查密码,即使数据库清楚地保存了新密码,它也有旧密码。在我看来,存储库的体系结构存在一些问题,导致它加载旧的上下文或类似的东西,但是每次实例化类时它都会创建一个新的 PortalContext()。有什么想法吗?
public class BaseRepository
{
protected readonly PortalContext Context = new PortalContext();
}
public class UserRepository : BaseRepository, IUserRepository
{
public bool ValidateUser(string username, string password)
{
var user = Context.Users.FirstOrDefault(x => x.LoginName == username);
if (user == null) return false;
return user.Password == password;
}
}
.NET 代码隐藏
public partial class _default
{
private readonly IUserRepository _userRepository = new UserRepository();
protected void btnSubmit_Click(object sender, EventArgs e)
{
if (_userRepository.ValidateUser(txtUsername.Text, txtPassword.Text)
{
// Log user in
}
}
}
编辑:如果我将 ValidateUser() 更新为以下代码,问题就会消失。这似乎证实了它与旧上下文有关。
public bool ValidateUser(string username, string password)
{
using (var context = new PortalContext())
{
var user = context.Users.FirstOrDefault(x => x.LoginName == username);
if (user == null) return false;
return user.Password == password;
}
}
【问题讨论】:
-
这对我来说似乎很奇怪。我认为您提供的代码是正确的。问题似乎显然在其他地方......
-
我会同意,除了没有什么其他的。后面的代码调用 _userRepository.ValidateUser() 查询数据库以查看登录是否有效。 ValidateUser() 在之前加载用户并且密码更改后返回 false。
-
您完全确定每个请求都会获得一个新的存储库实例吗?以及如何更改数据库中的用户记录?也通过实体框架?
-
是的,每个请求都会获得一个新实例(我设置了一个断点以确保)。密码是通过同一个存储库更改的,但是我是通过代码更改它还是只是在数据库中手动更改它并不重要。一旦为特定用户调用了 ValidateUser(),一旦密码更改再次调用它就会失败,无论使用什么机制来更改它。
-
在ValidateUser方法中设置断点,第二次登录失败时查看数据库中的值是什么
标签: c# entity-framework