我在页面上有一个部分,用户可以在其中更改用户名。这基本上就是代码:
user.UserName = txtNewUserName.Text;
user.Save();
user是我的dbml中的一个类,并在数据上下文中保存调用SubmitChanges。
在数据库中更改了名称,因此当它调用以下方法时,它会失败,因为它正在尝试使用旧用户名而不是现在数据库中的用户名来获取用户。
public override string[] GetRolesForUser(string username)
{
return dc.Users.Where(u => u.UserName== username)
.SingleOrDefault().Roles
.Select(r => r.RoleName).ToArray<string>();
}
答案 0 :(得分:1)
看起来你将GetRolesForUser
中使用的直流保持一段时间。因此,如果您之前已经重新审核了用户,然后再次请求同一个用户,则使用相同的数据上下文将返回该数据上下文缓存的用户。
尝试使用
public override string[] GetRolesForUser(string username)
{
using (var ctx = new MyDataContext()) {
return ctx.Users.Where(u => u.UserName== username)
.SingleOrDefault().Roles
.Select(r => r.RoleName).ToArray<string>();
}
}
修改强>
如果username参数包含旧用户名,那么您提供的函数在不返回旧用户的任何角色时正常工作...请确保将新用户名传递给函数。即这是一个问题,你持有传递给函数的值,而不是函数的问题。
第二次编辑(知道使用了RoleProvider后)
将用户保存到数据库不会更改当前用户的凭据。这些是在登录期间设置的。验证cou可以检查HttpContext.User
是否仍然保留用户名。所以你需要做的是强迫你再次登录,或者使用一个可模糊的标识符作为凭证,例如分配给每个用户的guid,然后用户名可以更改,角色仍然可以解析。