窗体身份验证User.IsInRole()随机不根据登录工作(Forms Authenticatio

2019-09-21 03:32发布

我改变了默认的登录功能的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重定向像我一样?

Answer 1:

的问题是,当LogOn功能被调用时,传入的请求没有经过身份验证的用户,该用户对象为空,这不是直到一个新的请求时,该用户对象被填充。 所以,当User.IsInRole()被调用的LogOnUsernull

总之,用户对象是先前在ASP.NET管道设置,执行所请求的ASP.NET页面的代码之前很久。 现在,在复诊时,ASP.NET运行时将看到窗体身份验证票和User.Identity.IsAuthenticated将是真实的,但不是这个请求。
...

此外,您将无法从User.Identity.Name获得的用户名。 相反,使用LoginControlID.Username。

http://forums.asp.net/post/1988606.aspx



文章来源: Forms Authentication User.IsInRole() randomly not working in LogOn