我在MVC5
中使用Cookie身份验证。我的网页每隔1-5秒就严重依赖经过身份验证和未经身份验证的Ajax调用来保持数据更新。因此,我的用户永远不会退出该网站。
我的理想情况:如果用户正在我的网站上主动浏览或执行操作,请保持会话处于活动状态。如果他们在10分钟后打开了一个页面,我希望他们的会话超时,我将使用失败的Ajax调用重定向到登录页面。我认为最好在控制器或行动层面完成。
我尝试按照下面的建议控制会话状态行为,但会话仍然没有超时。在每秒点击ReadOnly / Public一次65秒后,我调用ReadOnly / Authorized并成功从中检索数据。
这是我的CookieAuthentication配置。
public void ConfigureAuth(IAppBuilder app)
{
// Enable the application to use a cookie to store information for the signed in user
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
ExpireTimeSpan = TimeSpan.FromMinutes(1),
});
}
我的测试页:
<div id="public"></div>
<div id="authorized"></div>
@section scripts{
<script>
function poll(times) {
var url = '/ReadOnly/Public';
$.ajax({
url: url,
dataType: 'json',
data: null,
cache: false,
success: function (data) {
$('#public').html(times + ' ' + data.test);
},
error: function (data) {
$('#public').html(times + ' ' + 'failed');
}
});
};
function checkAuth(times) {
var url = '/ReadOnly/Authorized';
$.ajax({
url: url,
dataType: 'json',
data: null,
cache: false,
success: function (data) {
$('#authorized').html(times + ' ' + data.test);
},
error: function (data) {
$('#authorized').html(times + ' ' + 'failed');
}
});
};
$(function () {
var times = 1;
setInterval(function () {
poll(times);
times++;
}, 1000);
setInterval(function () {
checkAuth(times);
}, 65000);
});
</script>
}
和测试控制器代码(尝试使用禁用和只读选项)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.SessionState;
namespace SessionTest.Controllers
{
[SessionState(SessionStateBehavior.ReadOnly)]
public class ReadOnlyController : Controller
{
[Authorize]
public ActionResult Authorized()
{
return Json(new
{
test = "ReadOnly and Authorized"
}, JsonRequestBehavior.AllowGet);
}
public ActionResult Public()
{
return Json(new
{
test = "ReadOnly and Public"
}, JsonRequestBehavior.AllowGet);
}
}
}
答案 0 :(得分:3)
也许您需要拥有2个独立的网络应用。一个用于提供经过身份验证的请求。另一个是所有公开要求。
这类似于Google Analytics脚本在Google网站上创建和维护自己的关于您网站的会话的方式,而不会影响您的网络应用程序的内部会话管理。否则,您将无法处理ASP .NET的默认行为,就像它处理cookie并保持会话活动一样。
祝你好运。答案 1 :(得分:2)
在这种情况下我不会实现超时。事实上,我试图避免它们,除非有必要的基本和关键原因,否则它们只会变成烦恼。
但是如果你觉得你需要一个,我会在这种情况下实现它,通过创建一个单独的javascript函数,它具有一个计时器,并通过用户输入重置。如果计时器完成,则执行ajax调用,该调用在服务器端执行手动会话失效。
答案 2 :(得分:2)
我会将侦听器方法或类配置为不使用会阻止它被扩展的会话。
可用于提供不同会话模式的方法和控制器的属性。
答案 3 :(得分:2)
Ajax调用将使会话保持活跃状态。
一种方法是在客户端设置超时以在一段时间后删除cookie。 我不确定你有更多的选择。
如果每5秒的呼叫仅针对未经过身份验证的请求,则只需将cookie保留在ajax请求之外。
答案 4 :(得分:0)
我认为默认情况下滑动过期设置为true。
我想也许在对公共行动进行的通话时,它是用cookie制作的,从而延长了超时时间。
public ActionResult Public()
{
return Json(new
{
test = "ReadOnly and Public"
}, JsonRequestBehavior.AllowGet);
}
如果我在下面设置:( SlidingExpiration = false)。我收到了失败的消息。
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
ExpireTimeSpan = TimeSpan.FromMinutes(1.0),
SlidingExpiration = false
//Provider = new CookieAuthenticationProvider
//{
// OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
// validateInterval: TimeSpan.FromMinutes(30),
// regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
//}
});