关于asp.net mvc:删除MVC身份验证超时/会话cookie后的Ajax请求

Ajax request after MVC authentication timeout/session cookie deleted

当用户超时或删除会话cookie cookie时,使用MVC 5身份验证,用户将被重定向到登录页面。

这在整个页面加载中都可以正常工作,但是对于我的Ajax调用,这会破坏客户端。重定向在验证页面显示时工作,但没有响应(在标准加载轮后面)。

我很确定这是某种JS问题。

JS:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$(function () {
    $('#dealSearchForm').on("submit", function (e) {
        e.preventDefault();
        $.ajax({
            url: this.action,
            type: this.method,
            data: $(this).serialize(),
            success: function (data) {
                $('#dealSearchForm').html(data);
            },
            complete: function (data) {
                $('#searchResults').show();
            }
        });
    });
});

主要观点:

1
2
3
4
5
6
7
8
9
10
11
@{Html.RenderPartial("_DealSearch");}

<script src="@Url.Content("~/Scripts/DealSearch.js")">



    $(document).ready(function () {
        @if (Model.Deals.Count > 0) {
            @Html.Raw("$('#searchResults').show();");
        }
    });

部分观点:

2

控制器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public virtual ActionResult Index()
        {
            var model = new DealSearchModel();

            return this.View(model);
        }

public virtual ActionResult DealSearch(DealSearchModel model)
        {
            // Get deals from service, uses search criteria
            model.Deals = GetDeals(model);

            // Return the view
            return PartialView(MVC.DealManagement.Views._DealSearch, model);
        }

我得到错误客户端:

Error client side

如果有人有任何想法,他们会非常感激的!


您必须重写默认行为-我假设您的问题是,当用户点击一个需要授权的操作,而当前他的会话已过期时,Ajax响应将不再有效。

您没有提供如何授权方法,但考虑创建自定义的authorize属性:

1
2
3
4
5
6
7
public class CustomAuthorizationAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        // Check whether it is an AJAX or standard request
    }
}

如何检查它是否是您可以在这里找到的Ajax请求。您应该返回403个未经授权的结果,并在Ajax调用中进行处理,而不是重定向。


使用基于Kamos答案的方法,我使用以下方法解决了这个问题:

自定义属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class AuthoriseAjaxAttribute : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAjaxRequest())
        {
            filterContext.Result = new RedirectResult("~/Error/AjaxUnauthorized");
        }
        else
        {
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
}

/error/ajaxUnauthorized视图

2

对于用户,这使得Ajax调用以同样的方式响应超时。