2017-10-20 652 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

相关问题