我正在开发一个项目,要求在一组MVC和WebAPI应用程序中无处不在。我正在尝试理解点击IIS中的“需要SSL”复选框之间的权衡。使用URL重写zmodule与在我的全局过滤器中使用RequireHttpsAttribute并修改我的web.config。
我发现以下指南详细说明了每种方法:
https://webmasters.stackexchange.com/questions/28057/iis-7-require-ssl-automatically-redirect-to-https http://tech.trailmax.info/2014/02/implemnting-https-everywhere-in-asp-net-mvc-application/
答案 0 :(得分:1)
解释机制可能很长,所以我只列出行为中最显着的差异:
做&#34;要求SSL&#34;在IIS中: 上下文基本上是为了它所做的事情,它需要&#34;要求&#34;不是&#34;强制执行&#34;,这意味着,如果人们试图通过http访问您的网站内容,服务器将只响应403错误,这通常不是一个理想的行为,但这可能有助于某些情况< / p>
使用URL重写模块: 模块本身可以做一些不同的事情,但我假设你只是要做常规的https重定向。这意味着,如果用户尝试通过http访问网站的任何内容,服务器将执行301或302重定向到相同网址的https版本。这通常是一个不错的选择,因为它不会影响网站的任何可用性。
全局RequireHttpsAttribute
操作过滤器:这与选项编号2类似,它将对任何正在执行ACTION的http请求执行302重定向。主要区别在于,这仅适用于控制器中的所有操作,这意味着,如果有人试图通过您网站上的http获取图像或css文件,此选项将允许它通过而不执行任何操作。这使您能够通过http提供静态内容,这在某些特定情况下非常有用
还有一件值得一提的事情,301和302重定向对于http POST不太好,所以如果你的用户试图通过http发帖,请求正文将会丢失(感谢来自@ChrisPratt的信息) )。
答案 1 :(得分:0)
通常,管理基础架构的人员负责确保https上的内容。通常他们并不擅长这一点,因此这是RequireHttpsAttribute开始的地方,因为它可以在代码级别加密https请求,从而强制执行仅HTTPS属性。
在实践中,它并不是那么好,因为许多生产设置 - 包括stackoverflow.com& - 看到https在被解包之前终止于边缘设备并作为http传递给后端应用程序要求https属性不够细微,足以理解这种区别。
一般来说,最好的选择是配置提供公共http接口的边缘设备采用HTTPS而且只采用HTTPS。然后设置辅助虚拟站点[或供应商适当的任何]以将所有流量重定向到规范的HTTPS URL。我依赖于RequireHttpsAttribute会有点紧张,除非它是一个处理它自己请求的小应用程序。这仍然会在工件和其他可能无法从控制器上消失的事物中留下空洞。