如何根据角色在登录方法上重定向asp.net成员资格用户

时间:2012-08-30 23:03:58

标签: asp.net-mvc asp.net-mvc-3 asp.net-membership forms-authentication

我正在使用带有.net成员资格的MVC3。 我想根据用户的角色将用户重定向到不同的视图。

我尝试使用AccountControler控制器的LogOn方法来使用User.IsInRole(xxx),但它不起作用。 从我在这里看到的: Forms Authentication User.IsInRole() randomly not working in LogOn

无法在该方法上调用成员资格用户(因为它未登录,用户登录用户的cookie尚未设置)

我不认为它是相关的,但为了以防万一,这是默认情况下在MVC3项目中出现的LogOn方法,以及我试图修改的方法。

    [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
                {
                    return RedirectToAction("Index", "Home");
                }
            }
            else
            {
                ModelState.AddModelError("", "The user name or password provided is incorrect.");
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

我的问题是: 在登录时根据角色(我只有几个角色)重定向用户的优雅方式是什么? 我看到一些建议说“只是查询会员数据库”,但我不认为这是一种正确的方法。

有什么建议吗?

谢谢!..

即插即用

1 个答案:

答案 0 :(得分:0)

由于您链接到我的问题,这是我发现的。 User.IsInRole()从响应中获取用户名。由于log on操作中没有用户名(没有使用Model.UserName查找),因此无法在角色中找到该用户。如果重定向它们,则用户信息将添加到重定向,并且可以按角色对用户进行排序。 (至少我认为这就是我发现的。)这就是你想要做的事情:

在您的帐户控制器中替换:

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
    {
        return RedirectToAction("Index", "Home");
    }
}

使用:

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
    {
        return RedirectToAction("Redirect", "Account");
    }
}

并添加:

public ActionResult Redirect()
{ 
    if(User.IsInRole("Role1"))
        return RedirectToAction("Index", "Home")
    else if(User.IsInRole("Role2"))
        return RedirectToAction("SomethingElse", "Home")
    else
        return RedirectToAction("AnotherThing", "Home")
}