【问题标题】:asp.net application authentication problemasp.net应用认证问题
【发布时间】:2011-05-09 14:03:32
【问题描述】:

我有一个使用表单身份验证的 asp Web 应用程序。我没有使用 asp.net 会员提供程序,我正在创建自定义身份验证。因此,当用户登录时,我为他创建票证和 cookie,当用户注销时,我将其删除。 当用户单击浏览器右上角的关闭按钮时,我遇到了问题。如您所知,这是一个客户端事件,没有运行服务器端事件。
我的问题是:
当用户单击关闭按钮以删除票证和cookie时,我该怎么办?

【问题讨论】:

    标签: c# asp.net forms-authentication


    【解决方案1】:

    您应该使用非持久性 cookie。为此,您可以将 false 传递给此方法的第二个参数:http://msdn.microsoft.com/en-us/library/twk5762b.aspx

    【讨论】:

    • 问题中提到除了cookie之外,还需要删除ticket。您的解决方案无法处理这种情况。
    • 我假设票在 cookie 中。这就是表单身份验证的工作方式。更重要的是,如果他真的像他所说的那样使用表单身份验证并且只实现了后端机制(即他正在使用 FormsAuthentication 类),这只是切换的一个参数。如果他没有使用 FormsAuthentication 类,我敢打赌他做错了:)
    • 我想@Ghyath Serhal 将“票证”称为标志、文件、数据库表中的记录或任何允许以某种方式知道会话处于活动状态的内容。会话到期后,此“票证”将被删除/失效。我错了吗?
    • 我不知道他叫什么票,但他声称在 ASP.NET 中使用表单身份验证。在表单身份验证术语中,“票证”是存储在 cookie 中的身份验证所需的加密数据 - support.microsoft.com/kb/910443 当然,他可能同时滥用了“票证”和“表单身份验证”,但你怎么知道呢?当然,他可能会用“cookie”来指代一种小烤饼,但我想他不是。
    【解决方案2】:

    您可以挂钩“onbeforeunload”DOM 事件。您可以采取几种方法

    1. 从客户端设置隐藏字段的值并调用 __doPostBack('fieldid')。在该字段的值更改事件的服务器端事件处理程序中,删除票证和您的身份验证令牌。您可以将其设为 ajax 回帖。想法是,即使用户关闭浏览器,您的网络服务器也会受到攻击,您将删除令牌。

    2. 在同一事件处理程序中触发 Web 服务调用以删除身份验证令牌。

    【讨论】:

    • 你必须小心使用 IE,拥有 onbeforeunload 事件处理程序有时会导致代码在每次单击超链接时触发事件处理程序。要解决这个问题,您可以执行类似 if ($.browser.msie) $('a').live('click', function() { var a = 1; document.ignoreUnload = document.ignoreUnload || $ 之类的操作。 inArray(this.id, Sys.WebForms.PageRequestManager.getInstance()._asyncPostBackControlClientIDs) > -1; });
    • 你真的建议这样做只是为了删除一个 cookie?
    • 这个想法是简单地捕获浏览器 closign 事件并触发服务器端调用以在服务器上进行任何必要的处理。真的可以是任何东西。所以我给出了一个通用的解决方案。
    • 服务器上不需要处理。客户端也不需要处理。当您关闭浏览器时,cookies 会被自动删除,除非它们被创建为持久性的。他所要做的就是创建非持久性 cookie。这就是网站登录时“记住我”选项的作用——在非持久性和持久性 cookie 之间切换。
    • 在没有明确说明“票证”一词的含义的情况下,我给出了一个足够通用的解决方案,可以捕捉这两种情况,并且是“可扩展的”,这与解决问题的霰弹枪鸽笼式编程方法不同最直接的问题,无需考虑可扩展性和可伸缩性
    【解决方案3】:

    我想您在用户会话到期或结束后立即删除票证,使用 session.Abandon() 和服务端的 session_end 事件。

    就我而言,我会等到超时使用 ASP.NET 会话过期机制自行关闭会话。显然你不想依赖它,这就是为什么你需要以某种方式捕获“windows close”事件并向服务器发送信号。

    This link 可能会帮助您举例说明如何执行此操作。

    【讨论】:

    • 好的。 Politness 在投反对票时添加评论,所以...等待评论。
    • cookies 会在浏览器关闭时自动删除,除非创建为持久的。在客户端和服务器端都不需要任何事件。这就是持久性 cookie 的全部含义,即“是否应该在浏览器关闭后保留它”。如果期望的行为是在浏览器关闭时删除 cookie,则将其创建为非持久性,否则创建一个持久性 cookie。
    • 您对非持久性 cookie 的看法是正确的。无论如何,@Ghyath Serhal 的想法是在服务器端关闭会话,而不依赖于超时机制。这里的问题是,无论客户端的 cookie 发生什么变化,无论它是否持久,当客户端窗口关闭时,服务器端的会话必须关闭。在服务器端关闭会话很重要,因为资源和东西可能已经分配并需要释放。
    • 请指出他在哪里说这是他的目标,或者至少在他使用“会话”或“资源”这些词的地方
    • 有人在不提供解释的情况下轻蔑地随机投票。我个人觉得这个人并没有真正抓住问题,而是真的想通过他/她自己的解决方案来推土机。哦,好吧,周围有各种各样的怪人。继续,也标记此评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 2011-05-02
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多