2

我们的安全团队要求将所有 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。

那里发生了什么事?为什么我们会得到这个异常?

4

1 回答 1

6

我正在搜索有关 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)

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

于 2016-07-12T10:08:52.070 回答