在MVC 3中,我们如何将用户重定向到默认URL,具体取决于其角色?

时间:2013-01-24 09:30:27

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

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时重定向到管理页面???

2 个答案:

答案 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();
    }
}