代理后面的安全表单身份验

时间:2011-06-16 19:01:00

标签: asp.net ssl forms-authentication haproxy

我们在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是开放的)?

2 个答案:

答案 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,则可以简单地删除此检查。)