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); } |
我得到错误客户端:
如果有人有任何想法,他们会非常感激的!
您必须重写默认行为-我假设您的问题是,当用户点击一个需要授权的操作,而当前他的会话已过期时,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调用以同样的方式响应超时。