在生产环境中启用SSL的Cookie,而在开发环境中禁用SSL。

3
基本上,我的网站有一个要求,即所有 cookie 必须是安全的。我正在尝试保护 FormsAuthentication cookie,但我希望在我的本地开发站点上不需要设置 SSL,而 live 站点仍然会保护 cookie。
这个 live/dev 状态存储在配置 xml 文件中。该文件包含站点运行的每台机器的设置。可以通过 Config.IsSecure 访问该文件。
if (Config.IsSecure)
{
    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, login.Username, DateTime.Now, DateTime.Now.AddMinutes(30), false, "User", FormsAuthentication.FormsCookiePath);

    string cookieStr = FormsAuthentication.Encrypt(ticket);
    HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, cookieStr);
    cookie.Path = FormsAuthentication.FormsCookiePath;


    System.Configuration.Configuration configuration = WebConfigurationManager.OpenWebConfiguration("~");
    AuthenticationSection authenticationSection = (AuthenticationSection)configuration.GetSection("system.web/authentication");
    FormsAuthenticationConfiguration formsAuthentication = authenticationSection.Forms;
    formsAuthentication.RequireSSL = true;
    cookie.Secure = true;
    configuration.Save()
}

FormsAuthentication.SetAuthCookie(login.Username, false);

我在保存时遇到了错误,提示有一个无法访问的临时文件。

您有什么解决办法吗?

Gurpreet


最简单的方法是在生产环境中使用IIS规则来保护您的网站,强制所有请求都使用HTTPS,并使用配置转换将表单身份验证配置的requireSSL属性设置为true。 - Chris Marisic
嗨,Chris,我该如何“使用配置转换将表单身份验证配置的requireSSL属性设置为true”? - swissarmykirpan
3个回答

2
我不太明白您想做什么,或者为什么您需要编写自定义代码才能实现它。我认为您可以在web.config中配置Forms Authentication以使用SSL进行cookie。然后只需为live和development分别创建不同的web.config。
requireSSL属性应该完全符合您的要求(将cookie设置为仅安全,以便浏览器仅在安全连接上返回forms auth cookie)。
类似以下内容(在web.config中):
<authentication mode="Forms">
  <forms  timeout="30" loginUrl="/MyLogin.aspx" protection="All" requireSSL="True" />
</authentication>

1

我正在尝试避免在本地机器上创建证书。 - swissarmykirpan

0

嗯,如果不保护整个站点,就无法保护cookie。cookie是使用标准的HTTP请求在页面下载时交换的,因此每个页面都必须是安全的。

你要保护的是登录表单...但那不是cookie。如果身份验证后重定向回http站点,cookie仍将是非安全的。

更新:

HttpCookie.Secure只做一件事-如果没有SSL,它将不会将cookie传输到客户端。如果通过HTTP访问站点,则生成的cookie头将不包含您的cookie。如果我正确理解文档,HttpCookie.Secure不会强制站点切换到SSL,它只会悄悄地破坏您的代码。


该网站在开发环境中仅通过http访问。整个网站在生产环境中仅通过SSL运行。 - swissarmykirpan
那么问题是什么?使用URL重写强制使用https-only,或者只允许https绑定,不允许http。您无需编写任何代码。 - Artemiy
我不想在开发机器上强制使用SSL https。 - swissarmykirpan
不要这么做,只需更改配置。为什么您要试图将配置作为登录过程的一部分进行更改? - Artemiy
将Cookie设置为安全的HTTPS协议和不安全的HTTP协议,在没有设置web.config文件的人工干预下。 - swissarmykirpan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接