条件ASP.NET MVC 3路由(带区域)

时间:2011-06-03 08:12:34

标签: asp.net-mvc-3 asp.net-routing

Hurro。

我正在尝试根据当前用户是否为管理员来实现某些条件路由。系统只有两种模式,admin或非admin,只不过是这个。我正在使用管理区域的区域,因为控制器名称是相同的,但它们在每种情况下都会提供不同的功能。

然而,在这个系统中,管理员不应该真正意识到他们的管理位置,他们只知道他们使用系统来做除了普通用户之外的其他事情。由于这个原因,我不希望在URL方面对它们进行任何区分。我想做的是能够做类似mysite.com/AuditHistory的事情,并且取决于你是管理员还是用户将依赖于使用 controller 。因此,如果是用户发出此请求,那么它将使用常规控制器文件夹中的AuditHistoryController,但如果它是管理员,那么它将使用区域/管理员/控制器中的AuditHistoryController。 / p>

我已经看到了IRouteConstraint的使用,可以按照以下几点做一些事情:

public class AdminRouteConstraint : IRouteConstraint
{
    public AdminRouteConstraint() { }

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        return httpContext.User.IsInRole("Admin");
    }
}

以下内容:

context.MapRoute(
    "Admin_default",
    "Admin/{controller}/{action}/{id}",
    new { action = "Index", controller = "Home", id = UrlParameter.Optional },
    new { controller = new AdminRouteConstraint() }
);

我可以简单地摆脱前面的“Admin /”并为其他路线做同样的事情但是说UserRouteConstraint吗?我没有在任何地方看到过这种情况,也不确定它是否正确。

关于如何做到这一点的任何想法?

1 个答案:

答案 0 :(得分:1)

如果用户是角色,您是否可以简单地将用户从ActionResult重定向?那就是你不介意改变URL吗?

像这样......

[Authorize]
public ActionResult AuditHistory()
{
   if(Context.User.IsInRole("Admin")
   {
      return Redirect("Admin/AuditHistory");
   }
   else
   {
      return View();
   }
}

对我而言,这有点像黑客。但它可能是一个解决方案。

显然,您需要进行基本检查,例如确保当前请求已通过身份验证等。

如果您确实不希望更改网址,则可能会有两个单独的视图并取消管理员Area

[Authorize]
public ActionResult AuditHistory()
{
   if(Context.User.IsInRole("Admin")
   {
      return View("AdminAuditHistory", new AdminAuditHistoryViewModel());
   }
   else
   {
      return View("AuditHistory", new AuditHistoryViewModel());
   }
}

事实上,我认为这可能是最干净的解决方案,但可能仍然是一个黑客攻击。

我希望这会有所帮助。