MVC 基于角色的路由

Posted

技术标签:

【中文标题】MVC 基于角色的路由【英文标题】:MVC role-based routing 【发布时间】:2012-01-01 03:35:56 【问题描述】:

我有一个包含 2 个区域 /Admin 和 /User 的项目。

管理员默认路由是/Admin/Home/Index,用户默认路由是/User/Home/Index

是否可以实施路由以使其主页 URL 看起来像 /Profile/Index 但为管理员和 /Admin/Home/Index 显示内容strong>/User/Home/Index 对于用户?

更新

终于知道怎么做了

context.MapRoute(
    "Admin",
    "Profile/action",
    new  area = AreaName, controller = "Home", action = "Index" ,
    new  RoleConstraint = new Core.RoleConstraint() ,
    new[]  "MvcApplication1.Areas.Admin.Controllers" 
);
...
context.MapRoute(
    "User",
    "Profile/action",
    new  area = AreaName, controller = "Home", action = "Index" ,
    new  RoleConstraint = new Core.RoleConstraint() ,
    new[]  "MvcApplication1.Areas.User.Controllers" 
);

public class RoleConstraint : IRouteConstraint

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    
        string roleName = db.GetRoleByUserName(httpContext.User.Identity.Name);
        string areaName = route.Defaults["area"].ToString();
        return areaName == roleName;
    

它有效,但对我而言,它不是 MVC 方式。有人知道怎么做吗?

【问题讨论】:

【参考方案1】:

是的。您展示的示例与 Microsoft 提供的许多使用 Route Constraints 的示例非常接近。在将请求传递到控件之前,路由引擎充当预代理(或路由器,如果您愿意的话)。定义了 IRouteConstraint 之类的项目,因此您可以按照您的描述进行操作。

【讨论】:

【参考方案2】:

我喜欢上面提到的那个解决方案,但要记住的一件事是路由本身不应该用作唯一的安全形式。请记住,您应该使用 [Authorize] 属性保护您的控制器和操作,否则您将限制访问。

【讨论】:

以上是关于MVC 基于角色的路由的主要内容,如果未能解决你的问题,请参考以下文章

无法基于角色 Laravel 8 保护路由

基于配置的 C# MVC 动态路由

基于多用户角色的路由级中间件

ASP.NET Core 6框架揭秘实例演示[02]:基于路由MVC和gRPC的应用开发

基于域和主机名的 ASP.NET MVC 路由

《ASP.NET Core 6框架揭秘》实例演示[02]:基于路由MVC和gRPC的应用开发