3

我需要为 ASP.NET Web 应用程序中的用户提供显式注销按钮。我正在使用带有基本身份验证 (SSL) 的 IIS6。我可以重定向到另一个网页,但浏览器使会话保持活动状态。我四处搜索并找到了一种方法,方法是启用一个活动的 x 控件与 IIS 通信并终止会话。我在一个不允许表单身份验证的受限环境中,也不禁止活动 x 控件。有没有其他人有这个要求,你是如何处理的?

好吧,这就是我害怕的。我在网上看到过类似的答案,我希望有人有办法做到这一点。不过,感谢您的时间。我想我可以使用 javascript 来防止像 history.back() 这样的后退按钮

4

4 回答 4

4

我自己为此苦苦挣扎了几天。

使用特定于 IE 的“ document.execCommand('ClearAuthenticationCache');”并不是每个人的好选择:1)它会刷新所有凭据,这意味着例如用户还将从他的 gmail 或他当前已通过身份验证的任何其他网站注销 2)它只是 IE ;)

我尝试使用 Session.Abandon(),然后重定向到我的 Default.aspx。仅此是不够的。您需要明确告诉浏览器发出的请求未经授权。你可以通过使用类似的东西来做到这一点:

response.StatusCode = 401;
response.Status = "401 Unauthorized";
response.AddHeader("WWW-Authenticate", "BASIC Realm=my application name");
resp.End();

这将导致以下结果:用户单击注销按钮 ==> 他将获得基本登录窗口。但是:如果他按下退出(登录对话框消失)并点击刷新,浏览器会自动再次发送凭据,导致用户登录,尽管他可能认为他已经注销。

解决这个问题的诀窍是总是吐出一个独特的“领域”。然后浏览器不会在上述情况下重新发送凭据。我选择吐出当前日期和时间。

response.StatusCode = 401;
response.Status = "401 Unauthorized";
string realm = "my application name";                
response.AddHeader("WWW-Authenticate", string.Format(@"BASIC Realm={0} ({1})", realm, DateTimeUtils.ConvertToUIDateTime(DateTime.Now)));
resp.End();

您需要做的另一件事是告诉浏览器不要缓存页面:

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.MinValue);
Response.Cache.SetNoStore();

有了所有这些东西,它(对我来说)在 IE 中工作,但直到现在我仍然无法阻止 Firefox 在用户第一次按下转义键(隐藏基本登录对话框)然后刷新(F5 ) 或浏览器的后退按钮。

于 2010-03-24T09:42:06.550 回答
2

Session.Abandon方法销毁存储在 Session 对象中的所有对象并释放它们的资源。如果您不显式调用 Abandon 方法,则服务器会在会话超时时销毁这些对象。

于 2009-03-04T21:29:25.193 回答
0

您是否尝试过调用 Session.Abandon 以响应按钮单击?

编辑

这似乎是一个经典的后退按钮问题。

对于后退按钮,您几乎无能为力。想象一下,用户刚刚在一个新窗口中打开了当前页面,然后单击了 logOut 按钮,该页面似乎退出了,但它不会立即影响另一个窗口的内容。

只有当他们尝试在该窗口中的某个位置导航时,他们的会话才会明显消失。

许多浏览器以类似(尽管不相同)的方式实现后退按钮。返回上一页不一定是 HTML/HTTP 观点的导航。

于 2009-03-04T21:27:48.287 回答
0

这是适用于 IE6 及更高版本的此问题的解决方案。

<asp:LinkButton ID="LinkButton1" runat="server" OnClientClick="logout();">LinkButton</asp:LinkButton>


<script>

    function logout()
    {
    document.execCommand("ClearAuthenticationCache",false);
    }
 </script>

从http://msdn.microsoft.com/en-us/library/bb250510%28VS.85%29.aspx找到这个

网络团队简而言之,请提供您的凭据

问:Jerry B. 写道,“在用户验证并处理了他的请求后,我现在想使他无效。假设这台机器处于一个任何人都可以走上来和我们一起走的开放环境中,我想给每个人一个新的挑战用户访问 Web 上特定模块的时间。”

答:这是 Internet Explorer 团队经常要求的功能,那里的好人为我们提供了在 Internet Explorer 6.0 SP1 中实现此功能的方法。您需要做的就是在文档上调用 execCommand 方法,将 ClearAuthenticationCache 作为命令参数传入,如下所示:

document.execCommand("ClearAuthenticationCache");

此命令会刷新缓存中的所有凭据,这样如果用户请求需要身份验证的资源,则会再次出现身份验证提示。

我把它放在我的注销链接按钮上,它适用于 IE6 sp1 及更高版本:

OnClientClick="document.execCommand('ClearAuthenticationCache');"
于 2010-02-02T18:24:26.653 回答