在本地主機上運行的網頁,如果我複製網頁鏈接(地址鏈接),然後複製到另一個標籤或瀏覽器,它不應該打開,它應該顯示一個登錄頁面。如何保護網頁
例如,網頁是
Login.aspx
Account.aspx
一旦登錄,帳戶頁面將打開,然後複製地址鏈接,然後嘗試在另一個選項卡或瀏覽器中打開。它是直接帳戶頁面顯示。
如果沒有登錄頁面,帳戶頁面不應直接打開。
如何保護網頁。
需要一些例子。
在本地主機上運行的網頁,如果我複製網頁鏈接(地址鏈接),然後複製到另一個標籤或瀏覽器,它不應該打開,它應該顯示一個登錄頁面。如何保護網頁
例如,網頁是
Login.aspx
Account.aspx
一旦登錄,帳戶頁面將打開,然後複製地址鏈接,然後嘗試在另一個選項卡或瀏覽器中打開。它是直接帳戶頁面顯示。
如果沒有登錄頁面,帳戶頁面不應直接打開。
如何保護網頁。
需要一些例子。
這將起作用。將其存儲在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;
}
}
同樣,我不明白爲什麼你不希望頁面在另一個選項卡中工作。但這會對你有用。
你可以這樣做。加載和卸載事件應設置爲會話。根據狀態,您可以決定顯示登錄或請求的頁面。設置到會話中可以通過AJAX完成。
如果在用戶未登錄時訪問Account.aspx
,那麼如何重定向到Login.aspx
?
這就是大多數網站的運作方式。
您可以在Account.aspx
中檢查會話狀態,然後相應地重定向到Login.aspx
。
這不是一個真正的設計你的網頁的好方法。 Http是無狀態的,這意味着保持已登錄用戶會話的典型方式是使用一個包含一些隨機會話字符串的cookie。該字符串會發送每個請求,服務器將檢查該字符串是否與會話相關聯。
現在 - 這裏的問題是,這個會話字符串是由用戶瀏覽器管理的,用戶瀏覽器純粹運行在客戶端。您可以讓瀏覽器「忘記」不同選項卡中的字符串,但它很複雜且怪異。
如果這是某種安全問題,請不要這樣做! :)永遠不要相信客戶端邏輯,以保持您的網站更安全..
[編輯]我假設你的意思是用戶登錄在第一個標籤,並沒有退出後?
要做你想做的事情,你需要了解瀏覽器中的de標籤是如何工作的。 通常它們共享cookie和會話狀態,這就是爲什麼當你在網站上進行會話時,如果你點擊一個鏈接或者打開一個新窗口,會話將繼續到那裏(這就是爲什麼你有一些安全問題的原因)。
解決你的問題,你需要保持會話以其他方式...... ,而我的不容易......
所以,如果你真的需要做到這一點,那麼你就需要有不共享的頁面上獨一無二的東西。 您可以在您選擇的每個鏈接上傳遞一個隱藏字段。但這意味着在管理頁面方面做了很多工作。它會帶來其他安全問題(例如,如果有人發送鏈接比會話也: - (
你可以做到這一點奇怪的方式是有基地頁 基地頁(包含幀)你會存儲會話在一些JavaScript。 然後所有的頁面檢查是否有首頁,以及是否有有效的會話。 當您打開新選項卡並複製鏈接時,框架頁面將變得乾淨,因此您需要新的登錄名。 我不知道它是否有任何其他安全問題attatch這樣做
會話跨標籤和窗口共享。它不會在不同的瀏覽器(例如IE和Firefox)中共享。
我不清楚爲什麼你需要保持變量分開跨標籤。
我想如果你想,你可以張貼從一個頁面到另一個值。在Page_Load中,如果不是isPostback,則將該值存儲在ViewState中。如果未收到該值,則重定向到登錄頁面。
但是,最好重新考慮爲什麼要這樣做。可能有更好的方法來實現你的目標。
如果referrer爲空或不登錄頁面,則重定向。
if (Request.UrlReferrer == null || !Request.UrlReferrer.LocalPath.Equals("/website1/account/login.aspx",StringComparison.OrdinalIgnoreCase))
{
Response.Redirect("/website1/account/login.aspx");
}
如果我的理解正確,我相信它是網絡瀏覽器的默認行爲。它與gmail,hotmail或提供登錄/註銷會話的任何其他Web應用程序的情況相同。登錄到gmail並打開您的聯繫人頁面,然後將聯繫頁面url複製並粘貼到另一個瀏覽器選項卡中,您將看到相同的聯繫人頁面,而不需要登錄頁面。
這個article可能會幫助你理解;並提供解決問題的方法。
正確支持會話合併非常重要,因爲大多數Web應用程序都是爲了期待它而編寫的。例如,當一個web應用程序打開一個彈出窗口時,它通常會這樣做,並期望彈出窗口將與主窗口共享cookie,以便用戶保持登錄狀態,並且他們的偏好將保持可用等。同樣,當用戶使用Duplicate Tab命令時,他們有理由期望新標籤向他們展示與原始標籤相同的內容 - 共享Cookie對於該場景正常工作至關重要。
你能解釋一下如何區分來自瀏覽器多個選項卡的請求嗎? – 2010-08-08 19:04:33
您可以爲每個加載標籤設置一個標記,如果未設置標記,則打開一個新標籤。 – thelost 2010-08-08 19:11:53
你可以解釋一下,該應用程序如何知道打開一個新選項卡? – 2010-08-20 05:42:56