public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}",
new { controller = "User", action = "Index", id = UrlParameter.Optional }
);
}
如果当前用户是管理员,那么他应该在输入root url时重定向到管理页面???
答案 0 :(得分:2)
有很多方法(大多数是自定义的)但是我使用默认的MVC功能并保持路由不变,而是根据安全角色有两个控制器操作:
// actions part of UserController
public ActionResult Index()
{
...
}
[Authorize(Roles = "admin")]
[ActionName("Index")]
[AdminsOnly]
public ActionResult IndexAdmin()
{
...
}
当用户成为特定角色的成员时,这将自动运行第二个。但是,如果您只有特定用户(admin),那么您可以将该属性更改为:
[Authorize(Users = "admin")]
如果您使用某种自定义机制来定义用户类型/角色成员身份,则始终可以编写自己的授权操作过滤器。
但AuthoriseAttribute
不是动作选择器过滤器,因此MVC无法通过创建自定义动作选择器过滤器AdminsOnlyAttribute
来区分这两者。这个会对你进行检查,你不会发现有一个请求有多个动作的错误。如果您要编写此自定义过滤器,则只需删除AuthorizeAttribute
,因为您的操作选择器已经检查过。
Route
如果这不是您想要的,您可以随时编写自己的自定义Route
类,根据用户/角色成员身份将用户重定向到特定区域...虽然重定向也可以成为您的一部分Login
行动
[HttpPost]
public ActionResult Login(LoginCredentials user)
{
// authenticate
...
if (User.IsInRole("admin"))
{
return this.RedirectToAction("Index", "User", new { area = "Admin" });
}
return this.RedirectToAction("Index", "User");
}
此操作假定您的应用程序中有管理区域。
另一种可能性是拥有自定义路线限制。因此,您实际上会定义两条路线,但其中一条路线具有特定约束:
routes.MapRoute(
"Admin", // Route name
"{controller}/{action}/{id}",
new { area = "Admin", controller = "User", action = "Index", id = UrlParameter.Optional },
new { isAdmin = new AdminRouteConstraint() }
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}",
new { controller = "User", action = "Index", id = UrlParameter.Optional }
);
通过这种方式,您可以将管理员路由到应用程序的 admin 区域,并为他们提供他们所拥有的特定功能。但它不需要管理区域。那只是我的路线定义。您可以按照自己的方式定义路径默认值。
答案 1 :(得分:0)
您可以在Index操作中实现此重定向:
public class HomeController: Controller
{
public ActionResult Index()
{
if (User.IsInRole("admin"))
{
// The user is an administrator => redirect him to his own page
return RedirectToAction("SomeActionName", "SomeControllerName", new { area = "admin" });
}
// the use is either not authenticated or not in the admin role => render some view
return View();
}
}