【问题标题】:What's the best way to direct user to different views by roles?按角色将用户引导到不同视图的最佳方法是什么?
【发布时间】:2014-07-30 17:32:05
【问题描述】:

在我的 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 方法中?

【问题讨论】:

  • 老实说,你在做什么听起来很糟糕。没有理由使用任何 HttpApplication 事件。挂钩这些听起来真的像是在做一些非常非标准的身份验证/授权编码。
  • 我的 Web 应用程序将存在于一个托管环境中,该环境具有 Web 代理,该代理监督该环境中的所有 Web 应用程序并执行所有身份验证。换句话说,我的就像一个儿童应用程序。 Web 代理将用户身份验证信息传递给我的应用程序,而后者仅根据传递给我的应用程序的用户角色信息进行授权。所以,是的,不是一个带有自己登录注销的独立应用程序,但我对此无能为力。
  • Eeeewww.这真的是真的 真的糟糕的设计。作为管理员,我可以轻松欺骗自己的凭据。
  • 可以理解,但我对此无能为力。客户多年来一直在使用这种设计。

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


【解决方案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
}

然后只需通过更改来更新登录方法:

return RedirectToLocal(returnUrl);

return Redirect("GoHome");

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

【讨论】:

  • 谢谢。我最终实现了一个自定义过滤器并覆盖了 OnActionExcuting 方法,以根据用户的角色重定向用户。
  • 只是让您知道,这可能并不总是有效。 ActionFilterAttributes 在 AuthorizationAttributes 之后执行。您可能需要考虑将其实现为授权属性。
  • 很高兴知道,到目前为止它运行良好。但我会记住这一点。谢谢。
猜你喜欢
  • 2010-09-17
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
相关资源
最近更新 更多