Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc PartialView渲染窗体超时_Asp.net Mvc - Fatal编程技术网

Asp.net mvc PartialView渲染窗体超时

Asp.net mvc PartialView渲染窗体超时,asp.net-mvc,Asp.net Mvc,我正在通过$.ajax获取部分视图,如果您将空闲时间设置为30分钟,然后尝试获取该部分视图,则表单身份验证已超时,我将登录页面呈现到我的页面中,而不是将我的部分视图返回给我 有没有关于如何处理这种情况的建议 多谢各位 $(function () { $("#addContact").click(function () { $.get('/Contacts/Add', function (data) { $("#content").html(data

我正在通过$.ajax获取部分视图,如果您将空闲时间设置为30分钟,然后尝试获取该部分视图,则表单身份验证已超时,我将登录页面呈现到我的页面中,而不是将我的部分视图返回给我

有没有关于如何处理这种情况的建议

多谢各位

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

这取决于您是否同意更改用户登录的时间长度。如果是,您可以将配置文件更改为以下内容

<authentication mode="Forms">
  <forms loginUrl="Login.aspx" timeout="512640" />
</authentication>
这将使用户登录一年。如果不允许更改用户登录的时间,则需要处理ajax响应并再次将用户重定向到登录表单。

您的添加操作是否有任何非ajax使用者?如果没有,我建议从操作中删除[Authorize]属性,这将消除超时重定向问题。如果使用[Authorize]装饰整个控制器,则需要删除控制器级别属性并装饰所有其他操作。讨厌,我知道

为了获得额外的安全性,您可以这样做,以防止非Ajax调用调用您的Add操作

另一方面,如果Add操作需要支持Ajax和普通调用,那么解决此问题的一种方法是创建一个新的属性类,该类继承并重写AuthorizeAttribute。查看来源以获得指导:

您应该能够通过重写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发起调用,您在这里要做的就是为他们的超时提供一个扩展。一旦他们刷新页面或导航离开,系统会提示他们像往常一样重新登录


希望有帮助。如果您遇到任何问题,请告诉我。

在进行Ajax调用之前,是否可以对未经授权的控制器进行另一次调用,以确保用户经过身份验证?如果是,请继续正常操作,否则您可以只显示登录灯箱,这样您就不会离开页面并维护用户体验。

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

我不允许这样做。我们的安全政策规定超时时间不超过30分钟。
public class AjaxAuthorizeAttribute: AuthorizeAttribute
{
    protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext)
    {
        if (httpContext.Request.IsAjaxRequest())
            return true;

        return base.AuthorizeCore(httpContext);
    }
}