注销按钮IIS6 ASP.NET基本身份验证

时间:2009-03-04 21:23:02

标签: asp.net iis session iis-6 basic-authentication

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

好的,这就是我所害怕的。我在网上看到了类似的答案,我希望有人能够做到这一点。谢谢你的时间。我想我可以使用javascript来阻止像history.back()

这样的后退按钮

4 个答案:

答案 0 :(得分: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();

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

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

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在用户第一次按下escape时登录用户(隐藏基本登录对话框)然后刷新(F5)或浏览器后退按钮。

答案 1 :(得分:2)

Session.Abandon方法会销毁存储在Session对象中的所有对象并释放其资源。如果未明确调用Abandon方法,则会话超时时服务器会销毁这些对象。

答案 2 :(得分:0)

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

修改

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

关于后退按钮,你几乎无能为力。想象一下,用户刚刚在新窗口中打开了当前页面,然后单击了logOut按钮,该页面似乎已注销,但不会立即影响其他窗口的内容。

只有当他们试图在那个窗口的某个地方导航时,他们的会话就会消失。

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

答案 3 :(得分: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');"