【问题标题】:Testing for HTTP headers being returned from an ASP.NET MVC Application测试从 ASP.NET MVC 应用程序返回的 HTTP 标头
【发布时间】:2016-07-28 20:43:52
【问题描述】:

出于安全原因,我在 MVC 应用程序中使用两种经典策略添加和删除了许多标头:

protected void Application_PreSendRequestHeaders(object sender, EventArgs e)
{
    HttpContext.Current.Response.Headers.Remove("X-AspNet-Version");
    HttpContext.Current.Response.Headers.Remove("Server");
    HttpContext.Current.Response.Headers.Remove("X-AspNetMvc-Version");
}

通过 Web.Config:

<customHeaders>
    <remove name="X-Powered-By" />
    <add name="X-Frame-Options" value="DENY" />
</customHeaders>

现在我使用 NUnitRhinoMocks 进行测试,FWIW。

考虑到模拟 HttpContext 的困难,对于我返回的任何视图,确保自定义标头存在或不存在于 http 响应中的好方法是什么? p>

【问题讨论】:

  • 您能否展示您迄今为止尝试过的测试之一,以便可以复制您的问题,也许有人可以提供可能的解决方案。

标签: asp.net-mvc unit-testing nunit rhino-mocks


【解决方案1】:

验证此行为的正确方法是通过组件测试。原因很简单;您正在尝试确保安全问题,在 UT 中没有任何东西可以确保您的组件将使用此行为。我可以为您提供几个选项(代码编织工具、添加公共方法等)以将其作为 UT 进行测试,但是,IMO 这是集成测试的经典案例。

要组件测试此行为,请执行以下步骤:

提升一个自托管服务器(Self-Host ASP.NETOWIN to Self-Host ASP.NET

然后调用一个方法并断言答案不包含标题:

HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url); 
HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();  

Assert.IsFalse(myHttpWebResponse.Headers.ContainsKey("X-Frame-Options");
Assert.IsFalse(myHttpWebResponse.Headers.ContainsKey("Server");
Assert.IsFalse(myHttpWebResponse.Headers.ContainsKey("X-AspNetMvc-Version");
//todo: add logic which read the following parameters from the configuration
Assert.IsFalse(myHttpWebResponse.Headers.ContainsKey("X-AspNet-Version");
Assert.AreEquals("DENY", myHttpWebResponse.Headers["X-Frame-Options"]);

【讨论】:

  • 作为这个问题和 Fox 回答的附录。可以为 Microsoft 密封类构建您自己的抽象,然后进行模拟和测试,或者您可以下载几个抽象项目之一,包括来自 Microsoft 的一个。另请参阅此问题以获取更多有用信息,特别是关于为什么我们会在 HttpContext 中遇到这些问题:stackoverflow.com/questions/1947471/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 2020-05-23
  • 2012-03-02
相关资源
最近更新 更多