【发布时间】: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