我通过$ .ajax()获取部分视图,并且在您设置空闲30分钟然后尝试获取该部分视图的情况下,表单身份验证已超时,而不是返回部分视图对我来说,我正在将登录页面呈现给我。
有关如何处理此类情况的任何建议?
谢谢。
$(function () {
$("#addContact").click(function () {
$.get('/Contacts/Add', function (data) {
$("#content").html(data); <--gets login page as data
});
});
});
答案 0 :(得分:2)
您的Add
操作是否有任何非Ajax消费者?如果没有,我建议从操作中删除[Authorize]
属性,这将删除超时重定向问题。 (如果整个控制器都装有[Authorize]
,则需要删除控制器级属性并装饰所有其他操作。很烦人,我知道。)
为了提高安全性,您可以执行类似操作,以防止非Ajax调用调用Add
操作。
public ActionResult Add()
{
if (Request.IsAjaxRequest())
return View("Error");
return View();
}
另一方面,如果您的Add
操作需要支持Ajax 和正常调用,那么解决此问题的一种方法是创建一个继承自和覆盖AuthorizeAttribute
。查看来源以获取指导:http://aspnet.codeplex.com/SourceControl/changeset/view/23011#266447
您应该可以通过覆盖AuthorizeCore
方法来实现这一目的,如此
public class AjaxAuthorizeAttribute: AuthorizeAttribute
{
protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext)
{
if (httpContext.Request.IsAjaxRequest())
return true;
return base.AuthorizeCore(httpContext);
}
}
现在,您可以在控制器和/或操作上使用[AjaxAuthorize]
。
要明确的是,如果他们通过Ajax发起呼叫,那么您在此处所做的就是为用户提供超时延期。一旦他们刷新页面或离开,他们将被提示重新登录,正常情况。
希望有所帮助。如果您遇到任何问题,请告诉我。
答案 1 :(得分:0)
在进行Ajax调用之前,您是否可以向未经授权的控制器创建另一个以确保用户已通过身份验证?如果是,请继续正常,否则您只需显示登录灯箱,这样就不会离开页面并保持用户体验。
答案 2 :(得分:0)
另一种解决方案是在登录页面添加一些脚本,以检查它是否在弹出窗口中呈现。如果是,您可以使用location.href()将整个页面重定向到登录页面。
答案 3 :(得分:-1)
这取决于您是否可以更改用户登录的时间长度。如果是,您可以将配置文件更改为以下内容......
<authentication mode="Forms">
<forms loginUrl="Login.aspx" timeout="512640" />
</authentication>
这将使用户登录一年。如果更改用户登录的时间不是一个选项,则需要处理ajax响应并再次将用户重定向到登录表单。