如何在 asp.net 应用程序中注销按钮 Windows 身份验证
Posted
技术标签:
【中文标题】如何在 asp.net 应用程序中注销按钮 Windows 身份验证【英文标题】:How to Logout button Windows Authentication in asp.net application 【发布时间】:2015-06-10 18:51:40 【问题描述】:在我的项目中,我使用的是 Windows 身份验证登录。 注销按钮是必需的。
如果单击注销按钮页面应重定向到 Logout.aspx。 如果我在浏览器中按下返回按钮,则在 Logout.aspx 中重定向回来。
如何控制不应该重定向到返回In LogOut Page和Ask for Window Authentication Login?
【问题讨论】:
【参考方案1】:在 Windows 身份验证中,没有注销的可能性,因为您没有使用 IIS 进行身份验证。您正在针对操作系统使用它,即使您在同一个浏览器中注销,然后在下一次请求时,您也会自动在同一个浏览器中登录。
所以在windows auhtentication中没有注销的可能性。
在堆栈溢出中查看相同类型的问题。
ASP.NET Windows Authentication logout
【讨论】:
我知道当您使用 Windows 身份验证时不可能注销,但是可以强制用户使用浏览器登录页面重新输入他的凭据吗?一定有办法做到这一点,对吧?我尝试过类似 document.execCommand('ClearAuthenticationCache', false) 的技巧,但没有奏效。用户第一次登录后,我无法在我想显示的时候显示登录页面。 @MHOOS Windows 身份验证的全部意义在于,用户根本不需要在浏览器中输入他们的凭据。这就像一个 SSO 解决方案 - 它使用他们在 PC 上的 Windows 登录身份来创建一个 Kerberos 令牌,网络服务器可以验证(通过询问 Active Directory)并使用它来识别它们。他们的用户名和密码永远不会传输到网络服务器。一个例外情况是,如果使用不支持 Kerberos 身份验证的浏览器(例如 Firefox),则它会回退到 NTLM,但您仍然无法在浏览器会话 AFAIK 期间强制重新身份验证。 @MHOOS 以及您为什么要希望用户重新输入他们的凭据?他们已经通过他们的令牌进行了身份验证,为什么还要再问呢?这只是给用户带来不便,您的应用不需要重新确认他们的身份 - 它会在每次请求时自动发送令牌,因此它知道谁在发出请求。我看不出你要求的目的。 @ADyson:目的是:当用户按下站点中的注销按钮时,他需要从站点中弹出并重新登录,否则注销有什么意义?想象一下,您按下注销按钮,您仍然处于登录状态。你会认为有问题,注销根本不起作用。 @MHOOS 是的,这就是我的意思 - 在您的网站上注销有什么意义?这是一个 windows-auth 应用程序 - 用户在登录 Windows 时登录,而不是登录您的站点。注销是指他们从 Windows 中注销,因为控制他们身份的不是您的站点,而是他们的身份。整个目的是避免他们在您的应用程序中登录额外的时间。我看不出您为什么想要或需要从实际站点注销。无论如何,Windows 身份验证实际上是不可能的,因为正如我所解释的,Windows 控制着该过程。您根本不需要注销按钮。【参考方案2】:在每个 .aspx 页面中使用此脚本
<script type = "text/javascript" >
function changeHashOnLoad()
window.location.href += "#";
setTimeout("changeHashAgain()", "50");
function changeHashAgain()
window.location.href += "1";
var storedHash = window.location.hash;
window.setInterval(function ()
if (window.location.hash != storedHash)
window.location.hash = storedHash;
, 50);
</script>
【讨论】:
【参考方案3】:我有一个网络形式的解决方案,你可以使用它,希望对你有用。
logout.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="logout.aspx.cs" Inherits="logout" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
</head>
<body>
<script type="text/javascript">
function HandleResult(arg, context)
window.location = "/Login.aspx";
</script>
<form id="form1" runat="server">
</form>
<script>
CallServer('LoGout', '');
var Backlen=history.length;
history.go(-Backlen);
window.location.href = "/Login.aspx";
</script>
</body>
</html>
注销.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class logout : System.Web.UI.Page, System.Web.UI.ICallbackEventHandler
public void RaiseCallbackEvent(string eventArgument)
public string GetCallbackResult()
return "";
protected void Page_Load(object sender, EventArgs e)
ClearAll();
ClientScriptManager cm = Page.ClientScript;
string cbReference = cm.GetCallbackEventReference(this, "arg", "HandleResult", "");
string cbScript = "function CallServer(arg, context)" + cbReference + ";";
cm.RegisterClientScriptBlock(this.GetType(), "CallServer", cbScript, true);
cm.RegisterStartupScript(this.GetType(), "cle", "windows.history.clear", true);
Response.Redirect("/login.aspx");
protected void Page_Init(object sender, EventArgs e)
ClearAll();
void ClearAll()
Session.RemoveAll();
System.Web.Security.FormsAuthentication.SignOut();
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
Response.Cache.SetNoStore();
我的项目中有这个,运行良好。
【讨论】:
非常感谢windows认证登录页面不可用 你能帮我登录页面代码如何在Window身份验证中使用吗? @HarshNag,我不明白你的意思,是的,当然为什么不,告诉我为什么你的登录页面不可用?!请上传您的 Web 应用程序示例,因为我不知道您拥有什么以及您想要做什么。 在上面你是重定向到 Login.aspx 页面在 Windows 身份验证登录页面不可用。如果我在浏览器中调用应用程序 URL,则会弹出一个窗口并询问用户名和密码。 所以你可以把 "/login.aspx" 替换成 "/" ,我不知道你的项目到底是什么样的。以上是关于如何在 asp.net 应用程序中注销按钮 Windows 身份验证的主要内容,如果未能解决你的问题,请参考以下文章