我们的安全团队要求将所有 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。
那里发生了什么事?为什么我们会得到这个异常?