c# - 会话过期时,Kendo 网格不会重定向到登录页面
问题描述
我的 Web 应用程序在使用 Ajax 加载的单个页面中有许多部分视图。
我希望所有 Ajax 请求在用户的会话/cookie 过期时将用户重定向到登录页面,而不是将登录页面加载到每个部分视图容器中。Web 应用程序正在使用表单身份验证。
我已经实现了这个解决方案,它在大多数情况下都可以正常工作。
问题是当用户刷新使用 Ajax 绑定的 Kendo 网格时,重定向不起作用。我在网络选项卡中看到重定向请求,但没有任何反应。我尝试实现自定义 Authorize 属性并更改 http 状态代码,但如果代码不是 401,ASP.NET 框架将不会重定向。如何使重定向工作?
这是我的自定义 Authorize 属性不起作用。我不确定使用自定义属性是否是正确的解决方案。
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);
}
}
}
解决方案
只要 mvc 管道处于活动状态,您在上面发布的代码就可以工作。问题是那些 ajax 调用可以出于各种原因完全绕过您的管道,ajax 调用不像表单发布那样构成完整的回发。也许您可以查看全局 ajax 处理程序并检查是否存在身份验证并根据需要进行重定向。据我记得,这些处理程序在任何“下层”结果处理程序之前被调用。
$(document).ajaxError(function (event, jqxhr, settings, data) {
...
});
$(document).ajaxSuccess(function (event, jqxhr, settings, exception) {
...
});
推荐阅读
- hapijs - 实现 hapi-joi 条件模式
- android - 如何避免admob adview被切断
- r - 从R中的函数内部写入文件
- amazon-web-services - s3上传拆分输出
- c# - .NET Core System.Drawing.Common PrintDocument 在 Linux 上不起作用
- c++ - 安装 BLAS 时遇到问题,以及 CMakeLists 的用途?
- python - 通过SSH从python连接Gitlab部署公钥
- java - 有没有办法使用场景形式测量房间的尺寸?
- javascript - 在 React JS 应用程序中处理通过 HTML 表单提交完成的发布请求
- ios - 触摸手势在 Scrollview(Xcode、Swift)中不起作用