如何在 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 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET 中注销时如何杀死用户的会话

使用浏览器后退按钮进行 ASP.NET 身份验证登录和注销

ASP.NET MVC 注销和返回按钮

如何在asp.net中恢复会话

如何在 cookie 上保留 ASP.NET 身份声明直到注销?

如何在asp.net中真正注销