我正在尝试使用ASP.NET MVC 2.0和表单身份验证来保护我正在开发的网站。为了保护表单身份验证cookie,我想将requiresSSL属性设置为true,这样只有当连接在SSL下时才由浏览器发送cookie,显然确保所有需要授权的资源都在SSL下。
我的问题是我们正在使用应用程序请求路由来实现许多功能,一个是SSL卸载,因此当请求到达我们服务器场中的任何Web服务器时,请求不再是SSL和FormsAuthentication.SetAuthCookie方法失败,因为在指定requiresSSL时需要SSL连接来设置cookie。
任何人都对这里的工作有任何想法!
由于
答案 0 :(得分:3)
所以我有一个解决这个问题的方法,但如果有人有任何更好的想法,请随时发表评论。基本上,您需要在请求结束时拦截响应并在表单身份验证cookie上手动设置Secure属性,非常明显,您还需要将表单身份验证配置中的requireSSL属性设置为false。另外请记住,我们不希望为经过身份验证的用户启用整个站点的HTTPS,因此可以解决此问题。
这种方法有一些注意事项,需要注意一些事项。
我在测试期间发现表单身份验证cookie总是写在响应中,因此我在浏览器中用一个空的身份验证cookie覆盖了有效的身份验证cookie,为了解决这个问题,我在其中包含了一些逻辑。要解决此问题的HTTP模块,请参阅下面的代码段。
所有需要授权的应用程序请求必须使用SSL,否则请求将不包含身份验证cookie以验证用户身份。
因为您只传递SSL请求的身份验证cookie,所以您需要另一种机制来告诉您的应用程序,当他们浏览网站的非SSL区域时,当前用户已经过身份验证,我已经实现了这一点当用户登录时设置的cookie,并且没有设置过期日期,因此将在用户会话结束时到期,当然如果用户退出,该cookie将被删除。
以下是在HTTP模块中实现的影响上述内容的逻辑,我在过去几个小时内一直在测试它并且还没有遇到任何问题,如果我这样做,我一定会更新这篇文章!
如果用户刚刚登录了逻辑,我们应该只向客户端发送身份验证cookie
private void EndRequest(object sender, EventArgs e)
{
var application = (HttpApplication)sender;
if (ValidRequest(application.Request) && application.Response.Cookies.Count > 0)
{
//only do the below if the user is not logging out the site, if the user is logging out we can
//leave the default forms authentication behaviour which is to expire the auth cookie
if (application.Request.AppRelativeCurrentExecutionFilePath != "~/authentication/logoff")
{
var requestAuthCookie = application.Request.Cookies[FormsAuthentication.FormsCookieName];
var responseAuthCookie = application.Response.Cookies[FormsAuthentication.FormsCookieName];
if (requestAuthCookie != null && responseAuthCookie != null && responseAuthCookie.Value.IsNullOrEmpty())
{
application.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
}
else if (responseAuthCookie != null && !responseAuthCookie.Value.IsNullOrEmpty())
{
responseAuthCookie.Secure = true;
application.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
application.Response.Cookies.Add(responseAuthCookie);
}
else if (responseAuthCookie == null || responseAuthCookie.Value.IsNullOrEmpty())
{
application.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
}
}
}
}
答案 1 :(得分:2)
SSL offload应该允许您从SSL卸载程序到Web服务器建立SSL连接。
从SSL卸载程序到Web服务器的SSL连接应使用最轻和最快(可能最弱)的加密。
这允许您使用安全cookie,减少服务器上的加密负载并避免修改代码。