2017-10-20 650 views
1

我已將以下配置設置爲LockOut.DefaultLockoutTimeSpan設置爲2 hoursApplicationCookie.ExpireTimeSpan設置爲one day。但是,如果應用閒置2個小時,則不會將用戶重定向到login page。在下面的View中,我使用Ajax,tabtrip中選項卡的單擊事件獲取選項卡的ID並將其傳遞給調用操作方法。但我注意到,如果我將應用程序閒置2小時,然後單擊該選項卡,它會將id值作爲空值傳遞,因此,如預期的那樣,操作方法失敗,並顯示Ajax方法的錯誤塊中的警報消息。 問題:如何在登錄會話過期時讓應用重定向到登錄頁面?很顯然,我在下面的代碼中錯過了一些東西。我正在使用ASP.NET Identity-3進行身份驗證。ASP.NET Core在會話超時後未重定向到登錄頁

UPDATE

正在發生的事情是,我已經被存儲在跨越頁面中使用的一些價值觀三個重要的會話變​​量。這些價值每隔15-20分鐘左右就會消失。因此,應用程序將錯誤消息拋出到Ajax代碼錯誤塊的警報(...)對話框中。所以我認爲它與認證cookie早日到期有關。但似乎這個問題與會議到期時間的關係比我需要的時間更早。

StartUp.cs

... 
public void ConfigureServices(IServiceCollection services) 
{ 
    ... 

    // Add framework services. 
    services.AddDbContext<ApplicationDbContext>(options => 
     options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); 

    services.AddIdentity<ApplicationUser, ApplicationRole>() 
     .AddEntityFrameworkStores<ApplicationDbContext>() 
     .AddDefaultTokenProviders(); 

    services.AddMvc(); 
    services.AddDistributedMemoryCache(); 
    services.AddSession(); 

    services.Configure<IdentityOptions>(options => { 
     // Lockout settings 
     options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(120); //The amount of time in minutes a user is locked out when a lockout occurs 

     // Cookie settings 
     options.Cookies.ApplicationCookie.ExpireTimeSpan = TimeSpan.FromDays(1); //Controls how much time the authentication ticket stored in the cookie will remain valid from the point it is created. Defaults to 14 days. 
     options.Cookies.ApplicationCookie.LoginPath = "/Account/LogIn"; //When a user is unauthorized, they will be redirected to this path to login. Defaults to /Account/Login. 
     options.Cookies.ApplicationCookie.LogoutPath = "/Account/LogOut"; 
    }); 

    // Add application services. 
    services.AddTransient<IEmailSender, AuthMessageSender>(); 
    services.AddTransient<ISmsSender, AuthMessageSender>(); 
} 
... 

MyView的

<html> 
... 
<div>Tabstrib here with tab1, tab2</div> 
... 
@section scripts 
{ 
    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); } 
    <script> 
     $(document).ready(function() { 
      ... 

     $('#myTabstripID li').click(function() { 
      var li_id = $(this).attr("id"); 
      $.ajax({ 
       url: '@Url.Action("ActionName", "ContrlName")', 
       data: { calledFrom: li_id }, 
       contentType: 'application/json', 
       dataType: 'html', 
       type: 'GET', 
       cache: false, 
       success: function (data) { 
        if (li_id == 'Tab1') 
         $('#menuAP').html(data); 
        else if (li_id == 'Tab2') 
         $('#menuUP').html(data); 
       }, 
       error: function (jqXHR, textStatus) { 
        alert('Error occurred'); 
       } 
      }); 
     }); 
    ... 
} 
+0

當一個Ajax調用訪問一個網站,而該網站需要重新認證,不應該返回一個401(需要授權)響應,而不是重定向到登錄頁面?我認爲這是Web API的本質。 –

+0

@Afshar我沒有使用Web API - 這是一個Web應用程序。但我明白你的觀點。這個問題似乎與會話變量到期有關 - 我已經爲該帖子添加了一個** UPDATE **部分。你想知道如何解決會話變量相關的問題嗎? – nam

回答

1

Lockout.DefautLockoutTimeSpan,就是要多長時間,用戶應該之前他(她)可以鎖定重新進行身份驗證再次,如果您在ASP.NET身份中啓用了鎖定。這不是會議結束前多久的時間跨度。

要啓用會話中間件,可以使用Microsoft.AspNetCore.Session包。

public class Startup 
{ 
    public void ConfigureServices(IServiceCollection services) 
    { 
     ... 
     services.AddSession(options => 
     { 
      options.IdleTimeout = TimeSpan.FromSeconds(60); 
      options.Cookie.HttpOnly = true; 
     }); 
     ... 
    } 

    public void Configure(IApplicationBuilder app) 
    { 
     app.UseSession(); 
     ... 
    } 
} 

但我認爲IdleTimeout使用由服務器來確定會話的閒置其內容被拋棄了。我認爲會話是用來傳遞頁面之間的數據。所以如果IdleTimeout發生,所有存儲在會話中的數據都將消失。

但是通過閱讀您的問題,我認爲您只是希望網站在由於不活動而要退出登錄時提示用戶。如果應用程序可以根據時間跨度自動註銷用戶,則該用戶可能不太友好,因爲用戶可能處於某種程度。

如果您想在一段時間後執行某個操作,即2小時後頁面上沒有任何活動,則有jQuery插件可幫助您檢測會話超時。不幸的是我忘記了之前使用過的那個名字。我相信你可以很容易地谷歌一個,如https://plugins.jquery.com/sessionTimeout/

+0

好點。那麼,我應該如何設定時間,比如在應用程序登錄用戶之前2小時? – nam

+0

我使用了jQuery超時插件,您可以在其中設置時間跨度,以便在時間跨度到期後執行一個操作。您可以將該操作設置爲將用戶註銷?我再次使用過一個庫來做同樣的事情,但我只是忘了名字。 –

+0

但我雖然ASP.NET Core有一些配置設置來設置該時間段,對嗎? – nam

相關問題