[转载]ASP.NET MVC 最佳开发实践(3) | EntLib.net 技术分享平台.
ASP.NET MVC 最佳开发实践(1)
ASP.NET MVC 最佳开发实践(2)
扩展建议 – Extensibility Recommendations
在ASP.NET MVC 框架中有很多点可扩展,可替换任何核心组件,下面列举了部分:
- routing engine (MvcRouteHandler)
- controller factory (IControllerFactory)
- view engine (IViewEngine)
例如,你可以重写自己的Controller factory,使用IoC容器。另外,你可通过添加定制的行为来扩展框架,在框架中有一些标准的过滤器(filter),如OutputCache、HandleError和Authorize等等。
使用过滤器来添加动作
MVC支持通过attribute添加动作(filter),可在action方法和action结果之前和之后。这些过滤器在请求处理管道允许进行轻量级扩展。
过滤器可应用在action方法上,更改其行为。另外,过滤器也可应用在controller类之上,对controller类中的所有 action方法生效。可使用基类base class定义通用的行为方法,并应用过滤器在基类controller上,接着确保其他controller继承该基类。
如你想增加一个功能,记录每一次请求信息,分析HTTP header的问题。如下代码定义了一个继承ActionFilterAttribute的类:
public class LogHeadersFilterAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { foreach (string header in filterContext.HttpContext.Request.Headers.AllKeys) { Debug.WriteLine("Header " + header); Debug.WriteLine("Value " + filterContext.HttpContext.Request.Headers.Get(header)); } base.OnActionExecuting(filterContext); } }
为了添加给filter到指定的action方法,可简单将LogHeaderFilter属性添加到Action(或Controller)上面。
可测试性建议 – Testability Recommendations
MVC模式的一个主要优点是加强可测试性,保持关注点分离。在ASP.NET MVC 应用程序的Model中,可清晰分离和测试业务逻辑。如你可测试向拍卖网站增加一条拍卖纪录,不必依赖Controller或View。
编写单元测试
ASP.NET MVC 提供了很多工具,开发人员可用来创建可测试的应用程序。此外,也相当比较简单添加第三方的单元测试框架、Mocking框架、或依赖注入容器。ASP.NET MVC 提供了灵活的架构方便单元测试。
安全建议 – Security Recommendations
安全是现代软件开发项目中一个很重要的方面。尽管没有框架提供完美的安全,但有很多地方可做,来保护ASP.NET MVC 应用程序。
安全保护以防攻击
网站安全需要考虑所有web开发人员编写的企业级网站和服务,有许多众所周知的工具,如下所示:
- Cross-site scripting (XSS) attacks
- SQL injection
- Cross-site Request Forgery (XSRF)
- Improperly implementing model binding
(1) 阻止跨站攻击(XSS):
- 使用ValidateInput 属性禁止无效的请求;
- 在所有显示用户输入数据的地方使用Html.Encode,不管是立即呈现或数据将存入数据库,然后显示;
- 在Cookies上设置HttpOnly标识,阻止JavaScript读取和发送Cookies;
(2) 阻止SQL注入攻击:
- 总是使用参数化SQL查询;
- 不要传递未经检验的SQL脚本到数据库;
- 使用ORM工具,如Entity Framework,可完全消除在应用程序代码中编写SQL语句;
(3) 阻止跨站请求伪造攻击:
- 在表单中使用Html.AntiForgeryToken 类阻止跨站伪造情况。在接收post请求的Action方法上设置ValidateAntiForgeryToken 属性;
(4) 正确实现model binding:
- 显式指定模型绑定的类成员名称,如[Bind(Include=显式属性名称)];
- 还可创建视图模型(View model),用来接收外部表单输入,视图模型仅包含外部输入的属性;
对用户进行验证和授权保护内容
对于受限的数据视图,通过编写自定义的RoleProvider,或使用Authorize 过滤器属性。
使用<%: %> (.NET 4) 保护,以防XSS攻击
在.NET 4.0 之前,开发人员通过使用如下代码,来确保编码HTML:
<%= Html.Encode(ViewData[“name”]) %>
上述代码以防 XSS (cross-site scripting) 攻击。
如果你使用.NET 4,可不必使用上面的语法,简化语法如下:
<%: ViewData[“name”] %>
该脚本会自动对字符串进行HTML编码(如有必要)。