我们的安全团队要求将所有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。
那里发生了什么?为什么我们得到这个例外?
答案 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)评估
您必须避免以这种方式修改全局应用程序设置,并编写自己的过滤器来处理这种行为。