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

3
我有一个要求,在ASP.NET Web应用程序中为用户提供明确的注销按钮。我正在使用带有基本身份验证(SSL)的IIS6。我可以重定向到另一个网页,但浏览器仍保持会话活动状态。我已经在谷歌上搜索并找到了一种方法,通过启用ActiveX控件与IIS进行通信并终止会话来实现。我处于一个不允许表单身份验证的受限环境中,但ActiveX控件也没有被禁止。是否还有其他人有这个要求,并且你们是如何处理的?
好吧,这正是我担心的。我在网上看到了类似的答案,希望有人能够找到解决方法。虽然感谢您的时间,但我想我可以使用JavaScript来防止后退按钮,就像history.back()一样。
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();

这将导致以下结果:用户单击注销按钮 ==> 他将获得基本的登录窗口。然而:如果他按下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在用户首次按下Esc(隐藏基本登录对话框)然后刷新(F5)或浏览器的后退按钮时自动登录用户。


2

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


当我点击返回按钮时,我仍然被认证。protected void logOut_Click(object sender, EventArgs e) { Session.Clear(); Session.Abandon(); ViewState.Clear(); FormsAuthentication.SignOut(); Response.Redirect("http://www.google.org"); } - willyconnor
这听起来像是您正在查看页面的缓存版本。如果您尝试从服务器强制刷新,您会注意到会话已过期。 - Ken Browning
我应该指出,您可以禁用缓存。有几个stackoverflow问题解释了如何实现这一点。 - Ken Browning
@Ken:通过后退按钮提供的内容不一定来自缓存,也不一定遵守服务器提供的缓存控制头。后退按钮的功能超出了HTTP协议的范围,完全由浏览器自行决定。 - AnthonyWJones
HTTP头已在IIS中设置,并通过Firefox的Live HTTP headers扩展进行了验证。我还使用另一个Firefox插件Cache Viewer验证了缓存是否被销毁。浏览器是否可能保持会话处于活动状态?您知道任何测试此的方法吗? - willyconnor
显示剩余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');"

0

你尝试过在按钮点击的响应中调用Session.Abandon吗?

编辑:

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

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

只有当他们尝试在那个窗口中导航到某个地方时,才会发现他们的会话已经消失了。

许多浏览器以类似(虽然不完全相同)的方式实现后退按钮。从HTML/HTTP的角度来看,返回到上一页并不一定是一次导航。


当我点击返回按钮时,我仍然被认证。protected void logOut_Click(object sender, EventArgs e) { Session.Clear(); Session.Abandon(); ViewState.Clear(); FormsAuthentication.SignOut(); Response.Redirect("http://www.google.org"); } - willyconnor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接