我的Web应用程序在一个页面中有许多使用Ajax加载的局部视图。
我希望所有Ajax请求在用户的会话/ cookie过期时将用户重定向到登录页面,而不是将登录页面加载到每个部分视图容器中。该Web应用程序正在使用表单身份验证。
我已经实现了this solution,并且在大多数情况下都可以正常工作。
问题是当用户刷新使用Ajax绑定的Kendo网格时,重定向不起作用。我在网络标签中看到了重定向请求,但没有任何反应。我尝试实现自定义Authorize属性并更改http状态代码,但是如果代码不是401,则ASP.NET框架将不会重定向。如何使重定向工作?
这是我的自定义“授权”属性,该属性无效。我不确定使用自定义属性是否是正确的解决方案。
public class AuthorizeUserAttribute : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
if (filterContext.HttpContext.Request.IsAuthenticated)
{
filterContext.Result = new HttpStatusCodeResult(System.Net.HttpStatusCode.Forbidden);
}
else
{
filterContext.Result = new HttpStatusCodeResult(System.Net.HttpStatusCode.Unauthorized);
}
//filterContext.Result = new HttpStatusCodeResult(System.Net.HttpStatusCode.InternalServerError);
//filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "account", action = "logon" }));
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}
}
答案 0 :(得分:1)
只要mvc管道处于活动状态,您上面发布的代码将起作用。问题是那些ajax调用可能由于各种原因而完全绕过您的管道,一个ajax调用不会像表单发布那样构成完整的回发。也许您可以调查全局ajax处理程序并检查是否存在身份验证,然后根据需要重定向。据我所知,这些处理程序在任何“低级”结果处理程序之前被调用。
$(document).ajaxError(function (event, jqxhr, settings, data) {
...
});
$(document).ajaxSuccess(function (event, jqxhr, settings, exception) {
...
});