gpt4 book ai didi

asp.net-mvc - 卸载 SSL 时保护表单例份验证 Cookie

转载 作者:行者123 更新时间:2023-12-04 12:24:57 26 4
gpt4 key购买 nike

我正在尝试使用 ASP.NET MVC 2.0 和表单例份验证来保护我目前正在开发的网站。为了保护表单例份验证 cookie,我想将 requiresSSL 属性设置为 true,这样 cookie 仅在连接在 SSL 下时由浏览器发送,并且显然确保所有需要授权的资源都在 SSL 下。

我的问题是我们正在使用应用程序请求路由来实现许多功能,其中一个是 SSL 卸载,因此当请求到达我们场中的任何 Web 服务器时,请求不再处于 SSL 之下,并且 FormsAuthentication.SetAuthCookie 方法失败,因为当指定 requiresSSL 时,需要 SSL 连接来设置 cookie。

任何人都对这里的工作有任何想法!

谢谢

最佳答案

所以我有一个解决这个问题的方法,但是如果有人有更好的想法,请随时发表评论。本质上,您需要在请求结束时拦截响应并手动设置表单例份验证 cookie 上的 Secure 属性,非常明显,您还需要将表单例份验证配置中的 requireSSL 属性设置为 false。另请记住,我们不想为经过身份验证的用户启用整个站点的 HTTPS,因此可以解决此问题。

这种方法有一些注意事项和一些需要注意的事项。

  • 我在测试过程中发现表单例份验证 cookie 总是写入响应中,所以我一直用空的身份验证 cookie 覆盖浏览器中的有效身份验证 cookie,为了解决这个问题,我在 HTTP 模块中包含了一些逻辑来解决这个问题,请参见下面的代码片段。
  • 对应用程序的所有需要​​授权的请求都必须在 SSL 下,否则请求将不包含身份验证 cookie 以对用户进行身份验证。
  • 因为您只为 SSL 请求传递身份验证 cookie,所以您将需要另一种机制来告诉您的应用程序当前用户在浏览站点的非 SSL 区域时已通过身份验证,我已经使用附加的 cookie 实现了这一点,该 cookie 在用户登录,并且没有设置到期日期,因此将在用户 session 结束时到期,当然如果用户注销,此 cookie 将被删除。

  • 下面是在 HTTP 模块中实现的逻辑来影响上述内容,我在过去的几个小时里一直在测试这个,还没有遇到任何问题,如果我这样做了,我一定会更新这篇文章!

    如果用户刚刚登录,我们应该只向客户端发送身份验证 cookie 这是逻辑
  • 如果请求具有身份验证 cookie,则用户已通过身份验证
    并且在 SSL 下,因此请确保我们不会在
    回复。
  • 如果请求没有 auth cookie 但有一个有效的
    响应中的身份验证 cookie,将响应身份验证 cookie 设置为安全,
    所以它只在 SSL 下由浏览器传输。
  • 如果请求没有 auth cookie 并且响应有
    验证 cookie 无效或为空,请确保我们删除响应 cookie
    所以我们不会覆盖客户端浏览器中的有效 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);
    }
    }
    }
    }

    关于asp.net-mvc - 卸载 SSL 时保护表单例份验证 Cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4043141/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com