2010-07-13 114 views
1

我通过$ .ajax()获取部分视图,并且在您将空闲设置为30分钟然后尝试获取该部分视图的情况下,表单身份验证已超时,而不是获取我的部分观点返回给我,我得到的登录页面渲染到我的。部分视图渲染表单超时

关于如何处理这种情况的任何建议?

谢谢。

$(function() { 
    $("#addContact").click(function() { 
     $.get('/Contacts/Add', function (data) { 
      $("#content").html(data); <--gets login page as data 
     }); 
    }); 
}); 

回答

2

您的Add Action是否有任何非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

这取决于您是否可以改变用户登录的时间长度。如果你是,你可以改变你的配置文件,如下所示...

<authentication mode="Forms"> 
    <forms loginUrl="Login.aspx" timeout="512640" /> 
</authentication> 

这将保持用户登录一年。如果更改用户登录时间的时间不是一个选项,则需要处理ajax响应并再次将用户重定向到登录表单。

+0

我不能这样做。我们的安全政策规定超时时间不超过30分钟。 – 2010-07-14 02:08:00

0

在进行Ajax调用之前,您是否可以让另一个未授权的控制器来确保用户已通过身份验证?如果是,请继续照常,否则您可以显示登录灯箱,以便您不离开网页并保持用户体验。

0

另一种解决方案是将一些脚本添加到您的登录页面,以检查它是否在弹出框中呈现。如果是,您可以使用location.href()将整个页面重定向到登录页面。