在没有SSL的情况下使用AntiForgeryConfig.RequireSsl会导致随机错误

时间:2013-07-31 12:17:23

标签: asp.net-mvc ssl antiforgerytoken

我们的安全团队要求将所有Cookie设置为Secure = true。

要设置MVC AntiForgery的安全属性,我们使用以下代码:

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        AntiForgeryConfig.RequireSsl = HttpContext.Current.Request.IsSecureConnection;
    } 

但是现在我们的测试服务器上没有使用SSL的问题。有时我们会出现自发错误

The anti-forgery system has the configuration value AntiForgeryConfig.RequireSsl = true, but the current request is not an SSL request.

在查看ASP.NET MVC代码以查明异常的位置时,我们发现了以下内容

private void CheckSSLConfig(HttpContextBase httpContext)
{
    if (_config.RequireSSL && !httpContext.Request.IsSecureConnection)
    {
        throw new InvalidOperationException(WebPageResources.AntiForgeryWorker_RequireSSL);
    }
}

这似乎是正确的,它应该有效,因为执行顺序是

    AntiForgeryConfig.RequireSsl = HttpContext.Current.Request.IsSecureConnection;
    // ... something happens in between
        if (_config.RequireSSL && !httpContext.Request.IsSecureConnection)
        {
            throw new InvalidOperationException(WebPageResources.AntiForgeryWorker_RequireSSL);
        }

但是对于某些请求,似乎HttpContext.Current.Request.IsSecureConnection返回true,尽管我们在测试服务器上没有使用SSL。

那里发生了什么?为什么我们得到这个例外?

1 个答案:

答案 0 :(得分:3)

我正在搜索有关AntiForgeryConfig.RequireSsl的信息并找到了您的问题。 在您的以下代码中:

protected void Application_BeginRequest(object sender, EventArgs e)
{
    AntiForgeryConfig.RequireSsl = HttpContext.Current.Request.IsSecureConnection;
} 

使用本地值(Request.IsSecureConnection)修改应用程序级别值(AntiForgeryConfig.RequireSsl)。

如果您有2个具有不同Request.IsSecureConnection值的请求,您认为会发生什么? - 首先请求将AntiForgeryConfig.RequireSsl设置为false - 第二个请求将AntiForgeryConfig.RequireSsl设置为true - 第一个请求由CheckSSLConfig评估(true) - 第二个请求由CheckSSLConfig(true)评估

您必须避免以这种方式修改全局应用程序设置,并编写自己的过滤器来处理这种行为。