ASP.NET Core在会话超时后未重定向到登录页
我已将以下配置设置为LockOut.DefaultLockoutTimeSpan
设置为2 hours
和ApplicationCookie.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');
}
});
});
...
}
的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/
当一个Ajax调用访问一个网站,而该网站需要重新认证,不应该返回一个401(需要授权)响应,而不是重定向到登录页面?我认为这是Web API的本质。 –
@Afshar我没有使用Web API - 这是一个Web应用程序。但我明白你的观点。这个问题似乎与会话变量到期有关 - 我已经为该帖子添加了一个** UPDATE **部分。你想知道如何解决会话变量相关的问题吗? – nam