我自己为此苦苦挣扎了几天。
使用特定于 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 ) 或浏览器的后退按钮。