2011-05-09 57 views
2

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

回答

0

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

+0

该问题提到,除了cookie之外,还需要删除票证。您的解决方案将无法处理该情况。 – Nikhil 2011-05-09 14:22:13

+0

我假设票是在cookie中。这是表单身份验证的工作方式。更重要的是,如果他真正使用表单身份验证,并且只实现了后端机制(即他正在使用FormsAuthentication类),那么这只是切换的一个参数。如果他没有使用FormsAuthentication类,我敢打赌他错了:) – Stilgar 2011-05-09 14:28:46

+1

我想@Ghyath Serhal会在数据库表中或者其他任何可以知道某个会话处于活动状态的内容中调用“ticket”标志,文件,记录。该会话过期后,该“票证”将被删除/失效。我错了吗 ? – Larry 2011-05-09 14:47:40

0

您可以挂接到“onbeforeunload”DOM事件。有几个办法可以采取

  1. 从客户端设置一个隐藏字段的值,并调用__doPostBack(“fieldid”)。在此字段的值chagned事件的服务器端事件处理程序中,删除故障单和您的身份验证令牌。你可以把它作为ajax回发。 Teh的想法是,即使用户关闭浏览器,您的Web服务器也会被击中,并且您将删除令牌。

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

+1

虽然你必须小心使用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; }); – Nikhil 2011-05-09 14:13:52

+0

你真的建议这样做只是为了删除cookie吗? – Stilgar 2011-05-09 14:14:09

+0

这个想法是简单地捕获浏览器closign事件,并在服务器上发起服务器端调用以进行任何必要的处理。这可能是真的。所以我给了一个通用的解决方案。 – Nikhil 2011-05-09 14:20:05

0

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

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

This link可能会帮助您举例说明如何做到这一点。

+0

好的。在投票时,政治正在增加评论,所以......等待评论。 – Larry 2011-05-09 14:36:32

+0

除非创建为持久性,否则Cookie在浏览器关闭时自动删除。在客户端和服务器端都不需要任何事件。这就是持久性cookie意味着“浏览器关闭后应该保留”。如果期望的行为是在浏览器关闭时删除cookie,则将其创建为非持久性,否则将创建一个持久cookie。 – Stilgar 2011-05-09 14:39:38

+0

你对非持久性cookies是正确的。无论如何,@Ghyath Serhal的想法是关闭服务器端的会话,而不依赖超时机制。这里的问题是,无论cookie发生在客户端,无论持久与否,服务器端的会话都必须在客户端窗口关闭时关闭。在服务器端关闭会话非常重要,因为资源和内容可能已被分配并需要发布。 – Larry 2011-05-09 14:43:31