从asp.net中的不同浏览器选项卡中识别登录用户

Ath*_*hul 9 .net c# asp.net session login

我在asp.net中有一个带登录选项的网站.

如果我在两个浏览器选项卡中打开网站并使用相同的用户帐户登录并导航到两个选项卡中的主屏幕,现在我从一个选项卡注销并再次登录到同一选项卡,之后我点击了第二个选项卡,

我怎么能歧视我从第一个标签或第二个标签发送请求后面的代码?

如果请求来自第二个选项卡,我需要将应用程序导航到登录屏幕.我该怎么做?

在我的主页中,我添加了逻辑

if (Session["UserID"] == null)
{
   Response.Redirect("Login.aspx");
}
Run Code Online (Sandbox Code Playgroud)

但问题是,当我从第一个选项卡注销并再次登录时,在第二个选项卡刷新后,Session ["UserID"]不为空,因此它将保留在那里.但我需要重定向登录页面.我可以实现这个??

Pra*_*ukh 6

我建议您使用JavaScriptAjax Post进行重定向.我自己使用它,发现它可靠,满足需要.我仍然认为可能有更好的方法来做到这一点.但是现在这将完成你的工作.

下面的代码检查选项卡焦点/焦点丢失,并在Blur和焦点上调用Csharp代码.

    <script type="text/javascript">
        //divClearMessages
        $(window).on("blur focus", function (e) {
            var prevType = $(this).data("prevType");


            if (prevType != e.type) {   //  script for Please Come Back
                switch (e.type) {
                    case "blur":
                        // Use this if you want to check something after user changes tab
                    case "focus":
                        $.ajax({
                            type: "POST",
                            url: "main.aspx/CheckIfSessionIsNull", // Call here the Csharp method which checks the session and redirect user
                            contentType: "application/json; charset=utf-8",
                            dataType: "json",
                            success: function (retValue) {
                                // Do something with the return value from.Net method
                            }
                        });
                        break;
                }
            }

            $(this).data("prevType", e.type);
        })
    </script>
Run Code Online (Sandbox Code Playgroud)

在Code后面添加此方法:(记得添加[WebMethod]属性)

    [System.Web.Services.WebMethod]
    public static void CheckIfSessionIsNull()
    {
       if (System.Web.HttpContext.Current.Session["UserId"] == null)
          HttpContext.Current.Response.Redirect("Login.aspx");
    }
Run Code Online (Sandbox Code Playgroud)


Ste*_*edy 5

基本上您的问题是属于同一浏览器进程的选项卡共享cookie,因此每个选项卡使用相同的会话和会话cookie.

您可以通过关闭MSDN上记录的会话cookie来解决此问题:

<configuration>
  <system.web>
    <sessionState cookieless="true"
      regenerateExpiredSessionId="true" />
  </system.web>
</configuration>
Run Code Online (Sandbox Code Playgroud)

ASP.NET通过自动在页面的URL中插入唯一的会话ID来维护无cookie会话状态.

每个新选项卡访问一个没有会话ID的URL将启动一个新会话.

或者,您可以在初始页面加载事件中生成一些唯一ID,并通过将它们包装在类中并将该类的实例存储在会话内的新ID下来存储/检索会话变量.

信用和更多信息.