我们在Load Balancer上使用Stunnel(去除SSL)和HAProxy,然后通过HTTP将请求发送到IIS。
我们遇到的问题是我们希望我们的站点(ASP.NET)以安全的方式设置cookie - 即将requireSSL属性设置为true。
当我们设置此属性并向网站发出HTTPS请求时,我们会收到此错误:
The application is configured to issue secure cookies. These cookies require the browser to issue the request over SSL (https protocol). However, the current request is not over SSL.
如果请求是来自负载均衡器的SSL,是否可以信任Web服务器?或者这是一个非问题,因为它只能通过SSL访问我们的网站(只有443是开放的)?
答案 0 :(得分:2)
而不是:
FormsAuthentication.SetAuthCookie(email, false);
试试这个:
var cookie = FormsAuthentication.GetAuthCookie(email, false);
cookie.Secure = true;
HttpContext.Current.Response.Cookies.Add(cookie);
如果您使用的是ASP.NET MVC,还可以使用全局操作过滤器在响应中的所有Cookie上设置安全标志
答案 1 :(得分:2)
对于ASP.NET MVC 3用户 - 我们也是这样,您也可以使用我放在一起的以下GlobalFilter处理这个问题 - 然后可以保护发回的任何cookie: -
namespace MyNamespace
{
public class SecureCookiesAttribute : FilterAttribute, IResultFilter
{
public void OnResultExecuting(ResultExecutingContext filterContext)
{
foreach (string cookieName in filterContext.HttpContext.Response.Cookies.AllKeys)
filterContext.HttpContext.Response.Cookies[cookieName].HttpOnly = true;
if (filterContext.HttpContext.Request.IsLocal)
return;
foreach (string cookieName in filterContext.HttpContext.Response.Cookies.AllKeys)
filterContext.HttpContext.Response.Cookies[cookieName].Secure = true;
}
public void OnResultExecuted(ResultExecutedContext filterContext) { }
}
}
这将在任何cookie上设置HTTPOnly标志,然后如果请求来自非本地源,它也将设置安全标志。这允许我们通过HTTP而不是HTTPS进行本地调试(但如果您所做的一切都是通过HTTPS,则可以简单地删除此检查。)