【问题标题】:ASP NET MVC Validation Security IssueASP NET MVC 验证安全问题
【发布时间】:2012-06-16 18:22:22
【问题描述】:
我开始开发一个 ASP NET MVC 3 应用程序,并试图遵循一些好的 DDD 实践。我有以下情况想征求意见。
系统功能之一是创建系统的一个或多个用户将参与的活动,例如会议。任何具有特定访问配置文件的用户都可以创建新活动,也许只有创建活动的用户才能更改她。问题是:
插入此规则的正确位置是什么?
-> 在每个“活动”实体的设置器中?似乎打破了干燥。
-> 保存更改时在存储库中?在这种情况下,传递用户权限的正确时机是什么?
此方法的另一个参数?在类构造函数中(在我的模型中,存储库是接口,如果我采用此选项,
依赖关系仅在实现存储库的基础设施层中是显式的?)
-> 控制器?它似乎与贫血模型合作。
顺便说一句,问题比比皆是……你怎么看?
【问题讨论】:
标签:
c#
asp.net-mvc
validation
domain-driven-design
【解决方案1】:
如果您使用 ASP.NET Membership,您可以利用 Roles 和 Profile 提供程序并使用 Authorize 属性来限制对发生创建或编辑的实际视图的访问。例如,创建操作可以是:
[Authorize(Roles="Activity Admin")]
public ActionResult CreateActivity()
{
return View();
}
“活动管理员”是您的创建者角色。然后你的编辑可能看起来像这样:
[Authorize(Roles="Activity Admin")]
public ActionResult EditActivity(int id)
{
Activity activity = ActivityRepository.GetActivityByID(id);
if (activity.CreatorID != CurrentUser.ID)
{
return RedirectToAction("Activities");
}
return View(activity);
}
if 语句进行检查以确保当前登录的用户是实际创建活动的用户。 CurrentUser.UserID 可以替换为您用来检索当前登录用户的唯一 ID 的任何方法。我通常使用 ProfileBase 类来实现一个允许我跟踪当前用户信息的类。下面指向另一个 SO 问题的链接显示了如何做到这一点。
How can i use Profilebase class?