需要SSL但仍保留asp.net自定义错误

时间:2017-03-01 22:16:08

标签: asp.net-mvc http-error

我有asp.net自定义错误,但它们运行良好:

<customErrors mode="RemoteOnly" defaultRedirect="~/Error/Index/500">
  <error statusCode="403" redirect="~/Error/Index/403" />
  <error statusCode="404" redirect="~/Error/Index/404" />
  <error statusCode="500" redirect="~/Error/Index/500" />
  <error statusCode="502" redirect="~/Error/Index/502" />
  <error statusCode="503" redirect="~/Error/Index/503" />
  <error statusCode="504" redirect="~/Error/Index/504" />
</customErrors>

此外,已成功安装ssl证书,并且可以从http和https访问我的网站。

当我得到要求SSL的要求时出现了问题。该站点的http链接已分发给1000个用户。因此,我们需要将任何流向http地址的流量优雅地重定向到https主页。

我试图让重定向工作的任何解决方案都会破坏自定义错误。

我有这个测试网址生成错误,以便在〜/ error / test中测试我的自定义错误页面。它使用mvc布局显示我的自定义错误页面。

无论我如何设置,一旦我在IIS中的SSL设置中打开需要SSL,如果我打开任何http自定义错误(以便启用403.4重定向),它甚至不会尝试显示我的自定义500页。它显示了通用的http 500页面。

我希望403.4在http级别使用重定向处理,500使用我的自定义错误页面在asp.net级别处理。顺便说一下,这不是一个页面,而是一个使用会话变量中的.net异常的控制器。

我该如何做到这一点?

1 个答案:

答案 0 :(得分:0)

问题似乎是IIS与#34;需要SSL&#34;之间的脱节。功能和现有链接 - 在IIS中所做的一切都是因为它拒绝不通过HTTP发出的请求,它不会执行任何重定向。

403.4是custom IIS sub-status code,表示&#34; SSL必需&#34; - 如果您申请没有SSL的网站,则会收到该错误 - 即它会阻止所有未在HTTPS下发出的请求。

发出的实际响应是标准的403 - 禁止,没有涉及重定向,也没有告诉浏览器它应该通过SSL请求网站的任何内容 - 这些都在HTML中返回,并希望用户理解。在将请求传递给您的应用程序进行处理之前,IIS会发出错误,这就是您没有看到任何自定义错误的原因 - 无论哪种方式,如果您看到错误页面,它仍然是403页。

因此,如果您需要支持HTTP下的初始请求,则需要设置某种形式的重定向。

有几种方法可以做到这一点:

使用UrlRewrite模块 - 但请注意,这可能是单独的安装,具体取决于您的托管服务器。安装完成后,您可以执行以下操作:

<system.webServer>
    <rewrite>
        <rules>
            <rule name="RequireSsl" stopProcessing="true">
                <match url="(.*)" />
                <conditions>
                    <add input="{HTTPS}" pattern="ON" negate="true" />
                </conditions>
                <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

这将确保对服务器的所有请求(静态文件以及MVC路由)都被重定向到SSL。

另一个选项是[RequireHttps]过滤器属性,可以添加到控制器,操作或全局过滤器集合中,但这主要只影响MVC路由 - 静态文件仍然可以在没有HTTPS的情况下提供。

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    [...]
    // Add RequireHttps to any existing filters to force all routes to SSL
    filters.Add(new RequireHttpsAttribute());
}

请注意,这两者都只会导致客户端对GET请求执行重定向,大多数客户端会忽略301/302的POST请求,因为您不应该重新提交表单。

[RequireHttps]选项仅发出GET请求的重定向,POST请求将返回无效操作异常:&#34;必须使用HTTPS&#34;。