卸载 SSL 时保护表单身份验证 Cookie

2024-05-27

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

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

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

Thanks


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

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

  1. 我在测试过程中发现表单身份验证 cookie 始终写入响应中,因此我不断用空身份验证 cookie 覆盖浏览器中的有效身份验证 cookie,为了解决此问题,我在 HTTP 模块中包含了一些逻辑来解决此问题,请参阅下面的代码片段。

  2. 对需要授权的应用程序的所有请求都必须在 SSL 下进行,否则请求将不会包含身份验证 cookie 来对用户进行身份验证。

  3. 因为您只传递 SSL 请求的身份验证 cookie,所以您将需要另一种机制来告诉您的应用程序当前用户在浏览网站的非 SSL 区域时已通过身份验证,我已使用一个附加 cookie 来实现此功能,该 cookie 在用户登录,并且没有设置到期日期,因此将在用户会话结束时到期,当然,如果用户注销,此 cookie 将被删除。

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


如果用户刚刚登录,我们应该只向客户端发送身份验证 cookie,这是逻辑

  1. 如果请求有 auth cookie,则用户已经通过身份验证 并且在 SSL 下,确保我们不会在 回复。
  2. 如果请求没有 auth cookie 但有有效的 响应中的 auth cookie,将响应 auth cookie 设置为安全, 因此它仅由浏览器在 SSL 下传输。
  3. 如果请求没有 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);
            }
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

卸载 SSL 时保护表单身份验证 Cookie 的相关文章

随机推荐

  • 为什么边框会增加元素的宽度?

    我有一个div如下 其指定宽度为 300px 边框宽度为 2px 为什么2px边框会导致宽度div是304px 如果我希望它有边框但宽度仍为 300 像素怎么办 test width 300px height auto border 2px
  • 使用Combine,如何在网络请求后取消分配订阅

    如果您使用组合来处理网络请求URLSession 那么你需要保存Subscription 又名 AnyCancellable 否则它会立即释放 从而取消网络请求 稍后 当网络响应被处理后 您想要取消分配订阅 因为保留它会浪费内存 下面是执行
  • 我可以使用其他编程环境编辑 Google AppInventor 制作的应用程序吗?

    因此 我发现使用 Google AppInventor 制作 Android 应用程序与使用 Eclipse 的 Android 插件手动制作相比确实很容易 但由于 AppInventor 的能力有限 有什么方法可以使用 Eclipse 或
  • 从值获取键 - Dictionary>

    我无法通过指定值来获取密钥 我实现这一目标的最佳方法是什么 var st1 new List
  • 使用 C# 在 Windows 窗体应用程序中正确使用 OnClick 与 MouseClick 事件

    我目前正在开发一个自定义控件 并意识到我的代码正在运行两次 这实际上并不是一个大问题 它只是 Focus 方法调用 不过 我想了解一下 从阅读点击 MSDN说明单击事件 http msdn microsoft com en us libra
  • 按共同关联的数量排序 (Rails)

    背景 我有帖子和用户 并且都有很多社区 客观的 对于任何给定的用户 我想返回一个帖子集合 按该帖子与该用户有共同社区的数量排序 具有更多共同社区的帖子位于更高的位置 我当前的尝试 使用排序方法 有效 Post includes commun
  • MySQL更改表,添加具有唯一随机值的列

    我有一个表 我添加了一个名为phone 该表还有一个 id 设置为自动增量的主键 如何将随机值插入到电话列中 该值不会重复 以下 UPDATE 语句确实插入了随机值 但并非所有值都是唯一的 另外 我没有被卖掉 我投了phone字段也正确 但
  • 添加带有错误的弹出窗口,警告闪亮

    有什么办法可以添加一个popup 可关闭的窗口 其中包含警告或其他消息Shiny 我用来构建 Web 应用程序的 R 包 我已经寻找了一段时间但没有任何结果 虽然我不认为有任何本地可用的东西shiny 你可以尝试添加jQueryUI到您的应
  • NHibernate:如何从会话缓存中获取实体实例?

    我在工作单元开始时开始会话 并在工作单元结束时关闭 工作单元分布在多种方法中 在一种方法中 我使用加载实体Get方法 所以它位于会话缓存中 实体实例对于方法来说是本地的 因此 当方法范围结束时 实体实例将无法访问 但实体仍在会话缓存中 现在
  • Angular 2 错误:无法解析“RouteParams”的所有参数

    尝试使用 RouteParams 获取查询字符串参数 但我只是收到错误 无法解析 RouteParams 的所有参数 确保所有 参数用 Inject 修饰或具有有效类型 注释并且 RouteParams 用 Injectable 修饰 an
  • 读取 Nashorn JO4 和 NativeArray

    Java调用代码 import jdk nashorn api scripting myCustomHashMap dataStore new myCustomHashMap ScriptEngineManager sem new Scri
  • IntelliJ 建议错误的 @NotNull 注释

    IntelliJ 建议导入com sun istack internal NotNull以下程序中的 NotNull 注释 这是错误的 public class Test implements Comparable
  • 获取 ArrayIndexOutOfBoundsException 异常 [重复]

    这个问题在这里已经有答案了 这几天得到ArrayIndexOutOfBoundsException https docs oracle com javase 7 docs api java lang ArrayIndexOutOfBound
  • Captive Wifi 弹出窗口:单击链接打开 Safari

    我们的 iOS 设备 ipad iphone 等 网络出现问题 连接到 SSID 后 iphone ipad 立即打开强制网络助手 CNA 它就像一个缩小版的浏览器 没有导航按钮等 显示我们的欢迎页面 准备好让用户在网络中验证他的 MAC
  • 如何使用JQuery动态获取Body元素高度

    当我调整浏览器窗口大小时 我需要获取主体元素的高度和宽度 请帮我用JQuery解决这个问题 在窗口对象上使用调整大小事件 window resize function var width document width or window w
  • F# 匹配 ->

    我想做类似的东西 Nemerle 语法 def something match STT 1 with st Summ 2 with st AVG gt st summbycol counter STT 在 F 上 那么 F 是真的吗 没有对
  • Knockout JS - 如何正确绑定 observableArray

    请看一下这个例子 http jsfiddle net LdeWK 2 http jsfiddle net LdeWK 2 我想知道如何绑定可观察数组的值 我知道上面例子中的问题 就是这一行 p Editing Fruit p
  • 为什么 Contextmanager 会抛出运行时错误“生成器在 throw() 之后没有停止”?

    在我的 utility py 中 contextmanager def rate limit protection max tries 3 wait 300 tries 0 while max tries gt tries try yiel
  • 有没有带有保存和语法突出显示功能的 HTML、CSS 在线文本编辑器?

    我想让 css 文件可以从任何地方 家庭 办公室等 访问并准备好编辑 并保存 我将进行手工编码 只想语法突出显示并保存在网络设施上 我尝试了谷歌文档 这很好 因为我可以在线保存 而且它也有修订历史记录功能 这很有用 但它没有语法突出显示 也
  • 卸载 SSL 时保护表单身份验证 Cookie

    我正在尝试使用 ASP NET MVC 2 0 和表单身份验证来保护我当前正在开发的网站 为了保护表单身份验证cookie 我想将requiresSSL 属性设置为true 以便浏览器仅在连接处于SSL 下时才发送cookie 并且显然确保