2

欢呼。

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

然而,在这个系统中,管理员不应该真正知道他们的管理员位置,他们只知道他们使用系统做其他事情,而不是普通用户做的事情。因此,我不希望两者在 URL 方面有任何区别。我想要做的是能够做类似 mysite.com/AuditHistory 的事情,并且取决于您是管理员还是用户,这取决于使用的控制器。因此,如果是用户发出此请求,那么它将使用AuditHistoryController常规控制器文件夹中AuditHistoryController

我已经看到使用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?不过,我还没有在任何地方看到这样做,并且不确定它是否正确。

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

4

1 回答 1

1

ActionResult如果他们在一个角色中,你可以简单地重定向用户吗?也就是说,如果您不介意 URL 更改?

像这样的东西...

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

对我来说,这有点骇人听闻。但这可能是一个解决方案。

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

如果您真的不想更改 URL,您可能有两个单独的视图并取消管理员Area

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

事实上,我认为这可能是最干净的解决方案,但可能仍然有点 hack。

我希望这有帮助。

于 2011-07-21T15:00:21.670 回答