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
吗?我没有在任何地方看到过这种情况,也不确定它是否正确。
关于如何做到这一点的任何想法?
答案 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());
}
}
事实上,我认为这可能是最干净的解决方案,但可能仍然是一个黑客攻击。
我希望这会有所帮助。