0

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

我尝试使用 AccountControler 控制器的 LogOn 方法来使用 User.IsInRole(xxx) 但它不起作用。从我在这里看到的: Forms Authentication User.IsInRole() random 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);
    }

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

有什么建议吗?

谢谢!..

即插即用

4

1 回答 1

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")
}
于 2012-08-30T23:06:20.817 回答