通过角色将用户引导到不同视图的最佳方法是什么?

时间:2014-06-10 04:16:41

标签: asp.net-mvc redirect authorization asp.net-mvc-5

在我的ASP.NET MVC 5应用程序中,我们有许多用户角色,例如Admin,ReportUser,ProjectManager和类似的东西。我希望应用程序根据以下规则在登录后立即将用户重定向到视图:

如果用户是管理员,请重定向到/ Admin / Index

如果用户是ReportUser,请重定向到/ Report / Index

如果用户是ProjectManager,则重定向到/ Project / Index

我已经在web.config中使用AspNetWindowsTokenRoleProvider设置了一个角色管理器,我在global.asax的MyMvcApplication_PostAuthenticateRequest中设置了用户角色,效果很好。

但是,我不清楚在何处以及进行重定向的最佳方式是什么。在自定义授权属性类的OnAuthorization方法中?或者在global.asax的MyMvcApplication_PostAuthenticateRequest方法中?

1 个答案:

答案 0 :(得分:1)

如果您使用默认的Asp.net身份登录和模板逻辑,则应该有一个类似于以下内容的登录方法:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        var user = await _userManager.FindAsync(model.Email, model.Password);
        if (user != null)
        {
            await SignInAsync(user, model.RememberMe);
            return RedirectToLocal(returnUrl);
        }
        else
        {
            ModelState.AddModelError("", "Invalid username or password.");
        }
    }

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

所以创建一个新方法:

public async Task<ActionResult> GoHome()
{
  if (this.User.IsInRole("Admin"))
  {
    return Redirect("Action", "Controller");
  }
  // etc etc
}

然后只需更改:

即可更新Login方法
return RedirectToLocal(returnUrl);

return Redirect("GoHome");

双重定向的原因是认证发生在MVC管道之前,这意味着await SignInAsync(user, model.RememberMe)不会更改当前用户上下文,它需要重定向MVC才能看到更改。因此,在下一页上,它可以读取角色并正确重定向。