簡體   English   中英

如何禁用ASP.NET的自動注銷功能

[英]How to disable the auto-logout functionality of ASP.NET

我使用ASP.NET成員資格API。 這會自動注銷不活動的會話。 我不希望此自動注銷。 我使用了一些變通方法,例如在指定的時間后在ajax中調用頁面。 或者我使用了iframe方法來保持會話活動。 但是,這不太適合我的需求。 我想完全禁用此注銷功能。

請注意我的問題是為了回應本文

增加會話超時並不總是有效

乍一看,增加C#ASP .NET的web.config文件中的會話超時值應該可以解決該問題。 您將假定通過在下面的行中將超時值更改為60分鍾,用戶將在整個60分鍾內保持登錄到Web應用程序會話中。

<authentication mode="Forms">
  <forms name="MyAuth" timeout="60" protection="All" loginUrl="~/Web/Login.aspx" slidingExpiration="true" />
</authentication>

<sessionState mode="InProc" cookieless="false" timeout="60" />

但是,實際上存在兩個問題。 第一個問題是將超時值設置為大於1小時的任何值都會導致服務器上保留過多的內存,因為IIS在會話持續時間內會保留所有會話內存。 想象一下,在一個高流量站點上的超時值為5小時,其中包含了數千個用戶會話的所有會話數據。 第二個問題可能出在測試應用程序時,通常Web應用程序僅在15分鍾后就會超時。 到底是什么情況? 雖然問題可能實際上是在IIS中為會話超時或連接超時屬性配置的值(在共享托管的情況下,您甚至可能沒有訪問權限),但顯然我們需要控制會話超時,我們自己的雙手。

同樣的事情發生在我們身上,原因是我們的服務器必須處理IIS中的超時問題(即IIS請求超時),而我們沒有任何特定的控制權(在托管我的站點的服務器上)。

所以我們做到了。 (不是很好,但是對我有用。我希望您有一個掌握所有這些知識的主頁。否則,您必須在每個頁面上都做這件事)

假設您想將超時時間增加到任意限制,例如1天

1.首先將web.config中的值增加到默認值。 20分鍾。 最大值為一年。

2.在母版頁底部運行一個空的iframe。

<iframe id="SessionHandler" src="/html/SessionHandlerHack.aspx" frameborder="no" height="0" width="0"></iframe>

3,然后在頁面的代碼后面寫

C#

protected void Page_Load(object sender, EventArgs e)
{
    //Session timeout is now at 20 minutes. due to the unreliable nature of session,
    //we are setting the meta-refresh to be 15 minutes to be on safer side.
    Response.AddHeader("Refresh", "900");
}

VB.NET

Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    'Session timeout is now at 20 minutes. due to the unreliable nature of session,
    'we are setting the meta-refresh to be 15 minutes to be on safer side.
    Response.AddHeader("Refresh", "900")
End Sub

是的,它等效於添加刷新標頭,我們在代碼隱藏中進行了此操作,以使用變量操作15分鍾的值。 是的,

<meta http-equiv="refresh" content="900">

在ASPX頁面本身上就可以了。

4.在主頁上運行JavaScript計時器,該計時器的到期時間為24 * 60 * 60 *毫秒(即1天)。 到期后,將用戶重定向到這樣的注銷頁面。

var timeOut = 86400000; //24 x 60 x 60 x 1000 ie, number of milli-seconds in a day
$(document).ready(function () {//window.onload for you maybe?
    window.setTimeout(function () {
        window.location = "/LogIN.aspx?action=logout";
    }, timeOut);
});

邏輯是該站點不會超時,因為該超時具有滑動的到期時間,並且頁面中的iframe每15分鍾刷新一次,因此重新設置了會話到期時間。 現在,JavaScript計時器也可以在頁面上運行,並且不知道頁面中iframe發生的刷新,並且可以作為我們所需超時的超時裁判。 同樣,當頁面重新加載/導航離開並重新啟動計時器時,它會刷新。

第一次聽不見太多。 但這對我們有用,這是迄今為止我們找到的唯一解決方案(不是我們每天都在研究它:P)

希望這可以幫助。 快樂的會議黑客!

將身份驗證cookie設置為不結束的做法太冒險了。

為什么,因為任何人都可以隨時使用任何生成的經過身份驗證的cookie再次登錄。

若要閱讀有關此內容的更多信息,請閱讀該文章:FormsAuthentication.SignOut方法不能防止ASP.NET應用程序中的cookie回復攻擊”

並看到一些相關的問題, 服務器端不能禁用 表單身份驗證-Cookie重播攻擊-保護FormsAuthenticationTicket。 導致Cookie回復攻擊

一種解決方案是使用處理程序和簡單的JavaScript調用該處理程序,並不定期更新登錄會話。

html / javascript部分:

<img id="LiveImg" width="1" height="1" alt="" src="keepsessionalive.ashx?" /> 
<script>
var myImg = document.getElementById("LiveImg");
if (myImg){
    window.setInterval(function(){
          myImg.src = myImg.src.replace(/\?.*$/, '?' + Math.random());
        }, 3000);
}
</script>

而且keepsessionalive.ashx可以包含:

// 1x1 transparent GIF
private readonly byte[] GifData = {
    0x47, 0x49, 0x46, 0x38, 0x39, 0x61,
    0x01, 0x00, 0x01, 0x00, 0x80, 0xff,
    0x00, 0xff, 0xff, 0xff, 0x00, 0x00,
    0x00, 0x2c, 0x00, 0x00, 0x00, 0x00,
    0x01, 0x00, 0x01, 0x00, 0x00, 0x02,
    0x02, 0x44, 0x01, 0x00, 0x3b
};

public void ProcessRequest (HttpContext context) 
{
    // send the emtpy image
    context.Response.ContentType = "image/gif";
    context.Response.Buffer = false;
    context.Response.OutputStream.Write(GifData, 0, GifData.Length);
}

如果您還想使會話保持活動狀態以及身份驗證, IRequireSessionState在處理程序上使用IRequireSessionState

在每個呼叫中​​,身份驗證憑證將更新,並且您的會話將保留-如果用戶出於任何原因離開cookie的方式,則可以避免重播攻擊。

我還通過類似的答案介紹了自動重新加載圖像的技巧:
使相關的ASP.NET應用程序的會話從另一個ASP.NET應用程序保持活動狀態
重置會話超時,而無需在ASP.Net中進行回發
在ASP.NET中處理會話超時的最佳方法是什么
定義間隔后自動刷新ASP.NET網頁嗎?

將此添加到您的web.config:

<system.web>
<authentication mode="Forms">
      <forms timeout="99999999"/>
</authentication> 
</system.web>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM