ASP.NET MVC:对普通/管理员用户

时间:2016-03-15 23:58:47

标签: c# asp.net asp.net-mvc asp.net-mvc-5.2

我将分离ASP.NET MVC 5.2项目的管理员和普通用户部分。我的管理区域和普通用户区域共享了很多东西,但是每个区域的权限和细节都不同。

现在我不知道如何分隔管理区域和普通用户区域。我不知道是否应该为admin-panel创建不同的项目,或者我应该将admin路由到不同的路径并使用相同的控制器?或者我应该路由到不同的路径并使用不同的视图/控制器?

另外一个问题是,是否可以在同一个ASP.Net MVC解决方案中实际存在物理上分离的管理员和普通用户区?

1 个答案:

答案 0 :(得分:2)

通常在应用程序中,有各种端点使用相同的业务逻辑。在这种情况下我们该怎么做?我们可以轻松复制一个端点并将其粘贴到另一个端点,但是一旦业务案例发生变化,我们就需要在代码中的任何位置进行更改。

支持分离关注点,控制器应该有"代码"逻辑和另一层应该有"业务"逻辑。例如。控制器可以定义属性的命名方式,但不能定义用户名的长度。无论哪个控制器尝试注册用户,用户名应至少为3个字符。

应将实体模型满足业务案例要求的所有操作移至单独的层。通常称为服务层。

所有控制器都可以使用任何服务,而无需了解背后的业务场景。

这里的一个简单示例是两个控制器操作 - 其中一个 - 编辑您自己的配置文件,另一个 - 管理员编辑任意用户配置文件。

[Authorize]
public IActionResult Edit(UserViewModel model) {
    if(model.Id != this.CurrentlyLoggedUser.Id) { 
        return this.RedirectToAction(...);
    }

    var userService = new UserService(); // inject maybe
    userService.EditById(model.Id, model);

    return this.View();
}

和管理员行动

[Authorize("Admin")]
public IActionResult Edit(UserViewModel model) {
    var userService = new UserService(); // inject maybe
    userService.EditById(model.Id, model);

    return this.View();
}

"代码"这里的逻辑是 - 创建服务,调用封装的编辑逻辑。此举还需要考虑一些安全原因 - AuthorizeAuthorize Admin