我们目前正在重写已经编写过两次的组织ASP.NET MVC应用程序。 (曾经是MVC1,曾经是MVC2)。 (感谢上帝,那时生产准备就绪并且太成熟了。)
这一次,无论如何,这将是真正的交易,因为我们将随着时间的推移实现越来越多的功能,MVC1和MVC2的测试表明我们已经准备好升级
到目前为止,我们正在使用AuthorizeAttribute
的控制器和操作授权。
但是这不会再这样了,因为我们的观点应根据登录用户显示不同的结果。
使用案例:假设您是某个城市的专家,并且您登录的是联邦托管软件,您只能访问和编辑您所在城市的公民。
允许您通过包含MajorHasRightsForCity
和MajorId
的专门CityId
表格中的条目访问这些公民。
我想到的是这样的:
Public ViewResult Edit(int cityId) {
if(Access.UserCanEditCity(currentUser, cityId) {
var currentCity = Db.Cities.Single(c => c.id == cityId);
Return View(currentCity);
} else {
TempData["ErrorMessage"] = "Yo are not awesome enough to edit that shizzle!"
Return View();
}
静态类Access
将执行各种检查,并从其方法返回true或false。
这意味着每次更改内容时我都需要更改和编辑所有控制器。 (这将是一种痛苦,因为每次发生变化时都需要调整所有单元测试。)
甚至做过类似的事情allowed
?
答案 0 :(得分:2)
这就是我为一个体面的应用程序做的事情。
如果用户没有任何访问权限,我会返回一般错误视图return View("Error");
,因此您不需要在每个View
上处理错误消息。
从概念上讲,这(Controller
)是决定返回View
的逻辑所在的位置。它会阻止业务逻辑流入View
。
您可以将页面中某些与角色相关的部分抽象为部分视图,以避免混乱:
<% if (User.IsInRole("Admin")) { %>
Html.RenderPartial("AdminPanel");
<% } %>
答案 1 :(得分:2)
您是否考虑过编写自己的动作过滤器属性?
这样你就可以用属性装饰你的控制器并节省大量的复制和粘贴,如果它需要更改,那么它只能在一个地方完成。
如果从Codeplex获取MVC的源代码,您可以看到Authorize属性是如何完成的并修改它。