C# 如何在asp.net应用程序中注销按钮Windows身份验证

C# 如何在asp.net应用程序中注销按钮Windows身份验证,c#,asp.net,windows-authentication,C#,Asp.net,Windows Authentication,在我的项目中,我使用Windows身份验证登录。 需要注销按钮 如果单击注销按钮,页面应重定向至Logout.aspx。 在Logout.aspx中,如果我按下浏览器中的返回按钮,则返回重定向 如何控制不应重定向回“注销”页面并要求windows身份验证登录?在windows身份验证中,由于您没有使用IIS进行身份验证,因此无法注销。您正在对操作系统使用该功能,即使您在同一浏览器中注销,然后在下一次请求时,您也将自动在同一浏览器中登录 因此,不可能在windows身份验证中注销 请参阅堆栈溢出中

在我的项目中,我使用Windows身份验证登录。 需要注销按钮

如果单击注销按钮,页面应重定向至Logout.aspx。 在Logout.aspx中,如果我按下浏览器中的返回按钮,则返回重定向


如何控制不应重定向回“注销”页面并要求windows身份验证登录?

在windows身份验证中,由于您没有使用IIS进行身份验证,因此无法注销。您正在对操作系统使用该功能,即使您在同一浏览器中注销,然后在下一次请求时,您也将自动在同一浏览器中登录

因此,不可能在windows身份验证中注销

请参阅堆栈溢出中的类似问题


在每个.aspx页面中使用此脚本


函数changehasonload(){
window.location.href+=“#”;
setTimeout(“changehashtreach()”,“50”);
}
函数changehash(){
window.location.href+=“1”;
}
var storedHash=window.location.hash;
window.setInterval(函数(){
if(window.location.hash!=storedHash){
window.location.hash=storedHash;
}
}, 50);

我有一个Web表单解决方案,您可以使用它,希望对您有用

注销。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>

我在我的项目中有这样的功能,工作正常。

非常感谢您在windows身份验证中登录页面不可用您能帮我登录页面代码如何在windows身份验证中使用吗?@HarshNag,我不明白您的意思,是的,当然为什么不,告诉我为什么您的登录页面不可用?!请您上传一个Web应用程序的示例,因为我不知道您有什么以及您想要做什么。在上面的示例中,您被重定向到Windows身份验证登录页面中的Login.aspx页面不可用。如果我在浏览器中调用应用程序Url,会弹出一个弹出窗口,询问用户名和密码。因此,您可以将“/login.aspx”替换为“/”,我不知道您的项目是什么样的。我知道,当您使用Windows身份验证时,不可能注销,但是,可以强制用户使用浏览器登录页面重新输入其凭据吗?一定有办法,对吧?我尝试过document.execCommand('ClearAuthenticationCache',false)之类的技巧,但没有成功。一旦用户第一次登录,我就无法显示登录页面,以便在需要时显示。@MHOOS Windows身份验证的全部要点是用户根本不必在浏览器中输入凭据。它就像一个SSO解决方案——它使用PC上的Windows登录标识创建一个Kerberos令牌,Web服务器可以验证该令牌(通过询问Active Directory)并使用该令牌识别它们。他们的用户名和密码永远不会传输到Web服务器。例外情况是,如果使用的浏览器(如Firefox)不支持Kerberos身份验证,因此会退回到NTLM,但您仍然无法在浏览器会话AFAIK期间强制重新身份验证。@mOOS,为什么您仍希望用户重新输入其凭据?他们已经通过令牌进行了身份验证,为什么还要再问?这对用户来说只是一个不便,你的应用不需要重新确认他们的身份——它会随着每个请求自动发送令牌,因此它知道是谁发出了请求。我看不出你所要求的目的。@ADyson:目的是:当用户在站点中按下注销按钮时,他需要从站点中弹出并重新登录,否则注销的目的是什么?想象一下,你按下注销按钮,仍然登录。你会认为有什么地方出了问题,注销根本不起作用。@MHOOS是的,这是我的意思-在你的网站上注销有什么意义?这是一个windows身份验证应用程序-用户在登录到windows时登录,而不是登录到您的站点。注销是指他们从Windows注销,因为控制他们身份的是Windows,而不是您的站点。其全部目的是避免他们在应用程序中额外登录。我不明白你为什么想要或需要从实际站点注销。不管怎么说,Windows身份验证实际上是不可能的,因为正如我所解释的,Windows控制着这个过程。你根本不需要注销按钮。
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();


    }
}