我有以下配置,LockOut.DefaultLockoutTimeSpan
设置为2 hours
,ApplicationCookie.ExpireTimeSpan
设置为one day
。但是,如果应用程序空闲2小时,它不会将用户重定向到login page
。在下面的View
中,我使用的是Ajax
,其中选项卡条中选项卡的单击事件获取选项卡的id,并将其传递给调用操作方法。但我注意到,如果我让应用程序闲置2个小时,然后单击选项卡,它会将id值传递为null,因此,正如预期的那样,操作方法失败,Ajax方法的错误块中会显示警告消息问题:登录会话到期时,如何使应用程序重定向到登录页面?很明显,我在下面的代码中遗漏了一些内容。我正在使用ASP.NET Identity-3进行身份验证。
更新:
现在的情况是,我有三个重要的会话变量,它们存储了一些在页面中使用的值。每隔15-20分钟左右,这些值就会丢失。因此,应用程序会在Ajax代码的错误块的警报(…)对话框中抛出错误消息。所以我认为这与身份验证cookie提前过期有关。但这个问题似乎更多地与会话提前到期有关,而不是我需要它
启动.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');
}
});
});
...
}
Lockout.DefautLockoutTimeSpan
是指如果在ASP.NET Identity中启用了锁定,则用户在重新进行身份验证之前应该锁定多长时间。这不是会话超时前的时间跨度。
要启用会话中间件,可以使用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/