【问题标题】:How do people test their [RequireHttps] attribute in a Web API?人们如何在 Web API 中测试他们的 [RequireHttps] 属性?
【发布时间】:2014-07-13 00:54:06
【问题描述】:

快速版

我敢肯定,很多人在他们的 Web API 开发中的某个时候已经对某些描述(消息处理程序、属性等)实施了[RequireHttps] SSL 检查。你们如何测试它在成功和失败方面都能正常工作?

不是那么快的版本

我正在 OWIN 自托管 ASP.NET Web API 2 中开发 REST 服务。我已经成功地使用 SSL 保护了该服务,并实现了自定义 [RequireHttps] 属性(源自对 this SO question 的回答)。

在客户端调用正确的 URL(例如https://my.server.com/api/values)的情况下,如果我在属性定义中添加断点,调试器会正确中断代码(只需调用基础,一切都很好,正如预期的那样)。

问题是:我该如何练习这个属性的失败场景,这样属性代码将返回错误响应而不干扰其他服务器进程

我的 Web API 服务侦听基址 https://+:9443/。我尝试删除 s 以便连接到http://my.server.com:9443/api/values,但在大约一分钟超时后我收到错误响应状态 502(连接失败)。我想这很公平,但我实际上希望从我的[RequireHttps] 属性返回响应(“需要 SSL”)。

然后我尝试创建以下StartOptions 对象:

var options = new StartOptions();
options.Urls.Add("https://+:9443/"); // listen on port 9443 with SSL
options.Urls.Add("http://+:80/");  // listen to standard HTTP port 80

并像这样将其传递给 WebApp:

WebApp.Start<Startup>(options)

同样,当我连接到 http://my.server.com:9443/api/values 时,这不起作用,但当我连接到 http://my.server.com:80/api/values 时,它起作用了。

但是,这不是我想做的。我的生产服务器同时托管安全(HTTPS)和不安全(端口 80 上的 HTTP)资源,因此我的代码将拦截对依赖端口 80 的其他进程的合法调用,并告诉它们通过 https 重新连接,这是错误的。

有人可以建议我有哪些选择吗?考虑到我的情况,[RequireHttps] 是否有意义,因为它似乎从来没有做任何有用的事情?

【问题讨论】:

  • 我不明白你为什么认为你的代码会被“其他进程”调用。如果您在单个类或方法上使用修饰的属性,则只有在使用该类或方法时才会调用它。
  • 我自己也有点困惑。你是对的,如果我在类或方法上使用属性,那么只有在使用类或方法时才会调用代码。但是在消息处理程序的情况下呢?我希望在管道的早期抓住这一点(消息处理程序在过滤器之前处理)。然后,服务器上的“其他进程”可能会损坏。还是我又把自己弄糊涂了?
  • 我建议您不要在消息处理程序中做任何需要身份验证的事情,您的处理程序应该遵循经过身份验证的操作。如果你这样做,那么我建议首先实现一个身份验证处理程序,该处理程序链接到你的处理程序。像这样的东西。 weblog.west-wind.com/posts/2013/Apr/30/…
  • RequireHttps 操作不需要任何身份验证,所以我不确定您的意思。有两种实现 RequireHttps 的方法——作为消息处理程序或作为过滤器属性(都在我链接的 SO 问题及其答案中进行了解释)。我试图弄清楚我需要执行哪些步骤来测试成功案例和失败案例(使其返回错误),而不影响可能在其他端口、方案等上的服务器上运行的任何其他服务. 最后,我更喜欢使用处理程序,因为它比属性过滤器更早执行。
  • 消息处理程序仅在 WebAPI 调用时执行。它们不会为 MVC 调用或 ASP.NET 调用或其他任何东西执行,所以我仍然不清楚您所说的“其他服务器进程”是什么意思。

标签: c# asp.net .net ssl asp.net-web-api


【解决方案1】:

你试图做的事情无法完成。基本上,您正在尝试做与键入相同的事情

http:443//www.google.com

注意这也不起作用

问题是您试图通过 SSL 协议端口访问 http 协议,而这就是失败的原因。您的 RequireHttps 代码甚至无法执行,因为该请求甚至无法通过 IIS 处理。

【讨论】:

  • 我知道,这很公平(正如我在帖子中所说)。我的问题更多是关于 如何 我可以测试代码,而不是关于 为什么 它在特定情况下不起作用。我对帖子进行了编辑,以使我的问题更清晰(也许人们阅读起来更快)。
  • @djikay - 这就是重点,你不能测试它,因为它不起作用。它什么也做不了。您无法使用非 SSL 协议连接到 SSL 端口。它会失败。
  • 我找不到任何内容表明将您尝试放入的端口放在“http:443//www.google.com”中是合法的。我猜这就是为什么它不起作用。实际上,如果您将端口放在标准(并且可能只允许)位置,例如 http://www.google.com:443 (没有空格,我出于 SO 格式化原因放入了空格),那么它确实工作。 (尽管我确信 Google 已经实现了这一点。)
  • @mwardm - 是的,这是一个错字。它应该是http://www.google.com:443/ - 不,它不起作用,至少在 IE 或 chrome 中不起作用。也许您使用的任何浏览器都在更正它,或者您有某种插件,或者自动更正正在用 https 替换它
  • @ErikFunkenbusch 好的,我不得不承认它不起作用! (我在 Chrome 中,它看起来正在工作。我很小心地允许它自动任何 URL,但在进一步调查中显然仍然不够小心!)
猜你喜欢
  • 2021-07-03
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
  • 2011-01-31
  • 1970-01-01
  • 2012-08-21
相关资源
最近更新 更多