我改变了默认的登录功能的MVC3项目,将用户重定向到基于他们的某一页role
通过使用User.IsInRole()
当我测试了这一点,第一对夫妇的用户重定向符合市场预期,但在那之后我有一对夫妇未重定向到他们应该(他们通过所有的报表传递和命中默认的主索引。)看来完全随机的,有时我的admin
将采取的管理页面,其他时间不。
我的登录功能:
[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
if(ModelState.IsValid)
{
if(Membership.ValidateUser(model.UserName, model.Password))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
if(Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 &&
returnUrl.StartsWith("/") && !returnUrl.StartsWith("//") &&
!returnUrl.StartsWith("/\\"))
{
return Redirect(returnUrl);
}
else
{
if(User.IsInRole("Admin") || User.IsInRole("SuperAdmin"))
{
return RedirectToAction("Index", "Admin");
}
else if(User.IsInRole("Employee"))
{
return RedirectToAction("Index", "Employee");
}
else if(User.IsInRole("Accounting"))
{
return RedirectToAction("Index", "Accounting");
}
// If the user is in none of those roles, send them to the home index
return RedirectToAction("Index", "Home");
}
}
else
{
MembershipUser user = Membership.GetUser(model.UserName);
if(user == null)
ModelState.AddModelError("", "The user name or password provided is incorrect.");
else
ModelState.AddModelError("", "You haven't been approved yet, or you are locked out.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
纵观智能跟踪,好像有时候它并没有刻意去查询数据库,例如,它工作时我看到Execute Reader "dbo.aspnet_UsersInRoles_GetRolesForUser"
,当它没有我不知道。
有谁知道为什么User.IsInRole()
将返回false,即使用户在角色? 是否有某种形式的兑现情况发生,为什么不是每次queering的数据库?
我确切地知道用户在我测试的角色,我知道这是不是要重新定向到返回URL,我也知道这个角色不被存储在任何cookie。 任何想法,将不胜感激,我敢肯定,我会去了解这个法子,不过现在我更感兴趣的是,为什么这个简单的方法是行不通的。
更新
我发现,如果我更换If(User.IsInRole(...
一个重定向到被称为分拣另一个动作语句,我添加了if语句出现,它工作时间的100%。
public ActionResult Sorting()
{
if(User.IsInRole("Admin") || User.IsInRole("SuperAdmin"))
{
return RedirectToAction("Index", "Admin");
}
else if(User.IsInRole("Employee"))
{
return RedirectToAction("Index", "Employee");
}
else if(User.IsInRole("Accounting"))
{
return RedirectToAction("Index", "Accounting");
}
// If the user is in none of those roles, send them to the home index
return RedirectToAction("Index", "Home");
}
因此很明显, User.Identity.Name
未设置(或将不返回用户名),直到LogOn
函数退出。 这个对吗? 我盘算了一下后Membership.ValidateUser
被称为用户被验证,显然不是。
因此,在后什么时候Membership.ValidateUser()
被调用时,将User.IsInRole()
会正常工作? 是是cookie被删除后,还是什么?
我想我可以使用if(Roles.IsUserInRole(model.UserName, "Admin"))
因为我有从提交的模型的用户的姓名。 你认为这是一个更好的主意或只使用Sorting
重定向像我一样?