1

在本地主机上运行的网页,如果我复制网页链接(地址链接),然后复制到另一个选项卡或浏览器,它不应该打开,它应该显示一个登录页面。

例如,网页是

Login.aspx
Account.aspx

登录后,将打开帐户页面,然后复制地址链接,然后尝试在另一个选项卡或浏览器中打开。直接显示账户页面。

帐户页面不应在没有登录页面的情况下直接打开。

如何保护网页。

需要一些例子。

4

8 回答 8

1

你可以这样做。加载和卸载事件应该设置到会话中。根据状态,您可以决定显示登录或请求的页面。设置到会话中可以通过 AJAX 完成。

于 2010-08-08T10:07:57.393 回答
1

要做你想做的事,你需要了解浏览器中的标签是如何工作的。通常他们共享 cookie 和会话状态,这就是为什么当您在网站上进行会话时,如果您单击链接或打开一个新窗口,会话会在那里继续(这就是您遇到一些安全问题的原因) .

要解决您的问题,您需要以其他方式保持会话......这并不容易......

因此,如果您真的需要这样做,那么您需要在您的页面上添加一些不共享的独特内容。您可以在您选择的每个链接上传递一个隐藏字段。但这意味着在管理您的页面方面需要做很多工作。它还会带来其他安全问题(例如,如果有人发送链接而不是会话也会进行:-(

一种奇怪的方法是使用框架。在基本页面(包含框架的页面)上,您可以将会话存储在一些 javascript 中。然后所有页面检查是否有首页,以及是否有有效会话。当您打开一个新选项卡并复制链接时,框架页面将是干净的,因此您需要重新登录。我不知道这样做是否还有其他安全问题

于 2010-08-08T10:16:29.433 回答
1

会话在选项卡和窗口之间共享。它不会在不同的浏览器(例如 IE 和 Firefox)之间共享。

我不清楚为什么你需要在标签之间保持变量分开。

我想如果您愿意,您可以将一些值从一页发布到另一页。在 Page_Load 中,如果不是 isPostback,则将该值存储在 ViewState 中。如果未收到该值,则重定向到登录页面。

但是,最好重新考虑一下为什么要这样做。可能有更好的方法来实现您的目标。

于 2010-08-08T10:26:33.310 回答
1

如果我理解正确,我相信它是网络浏览器的默认行为。对于 gmail、hotmail 或任何其他提供登录/注销会话的 Web 应用程序也是如此。登录到 gmail,然后打开您的联系人页面,然后将联系人页面 url 复制并粘贴到另一个浏览器选项卡中,您将看到相同的联系人页面,而不会被要求登录页面。

这篇文章可能会帮助您理解;并提供一种解决方法。

对会话合并的适当支持很重要,因为大多数 Web 应用程序都是为期望它而编写的。例如,当一个 Web 应用程序打开一个弹出窗口时,它通常会期望弹出窗口与主窗口共享 cookie,以便用户保持登录状态并且他们的偏好仍然可用等。类似地,当用户使用复制选项卡命令时,他们有理由期望新选项卡向他们显示与原始选项卡相同的内容——共享 cookie 对于该场景正常工作至关重要。

于 2010-08-08T11:19:58.920 回答
1

这将起作用。将其存储在 Context.Items 中并将请求转移到其他页面。

//In Login.aspx
Context.Items["userName"] = myValue;
Server.Transfer("Account.aspx");

//In Account.aspx
protected void Page_Load(object sender, EventArgs e)
{
   if (!IsPostback)
   {
      if (UserName == null)
      {
         UserName == Context.Items["userName"];
      }
      if (UserName == null)
      {
         Server.Transfer("Login.aspx");
      }
   }
}

    private String UserName
    {
        get
        {
            if (ViewState["UserName"] != null)
            {
                return ViewState["UserName"].ToString();
            }
            else
            {
                return null;
            }
        }
        set
        {
            ViewState["UserName"] = value;
        }
    }

同样,我不明白您为什么不希望该页面在另一个选项卡中工作。但这对你有用。

于 2010-08-19T11:21:29.823 回答
0

当用户未登录时重定向到Login.aspxif访问如何?Account.aspx

这就是大多数网站的运作方式。

您可以检查会话状态,Account.aspx然后Login.aspx相应地重定向到。

于 2010-08-08T10:10:14.533 回答
0

这不是设计页面的好方法。Http 是无状态的,这意味着保持已登录用户会话的典型方法是使用其中包含一些随机会话字符串的 cookie。每次请求都会发送此字符串,服务器将检查该字符串是否与会话相关联。

现在 - 这里的问题是这个会话字符串由用户浏览器管理,它纯粹在客户端运行。您可以让浏览器“忘记”不同选项卡中的字符串,但这既复杂又古怪。

如果这是某种安全问题,请不要这样做!:) 永远不要相信客户端逻辑可以让您的网站更安全..

[编辑] 我假设您的意思是用户在第一个选项卡中登录,之后没有注销?

于 2010-08-08T10:13:08.563 回答
0

如果引用者为空或不是登录页面,则重定向。

if (Request.UrlReferrer == null || !Request.UrlReferrer.LocalPath.Equals("/website1/account/login.aspx",StringComparison.OrdinalIgnoreCase))
{
    Response.Redirect("/website1/account/login.aspx");
}
于 2010-08-08T11:07:16.097 回答