在我的MVC3应用程序中,有几种情况我会通过jQuery的ajax方法显示启动画面动态加载局部视图并将html注入DOM。
问题是如果身份验证过期然后用户启动ajax调用,被调用的操作将重定向到登录页面,因此返回登录页面的html并将其注入DOM,这显然正在进行对用户来说非常困惑。
人们通常如何应对这种情况?我认为这是常见的,因为表单auth和ajax对html的请求是我做了很多的事情。
答案 0 :(得分:3)
此问题有多种解决方案here。我更喜欢解决方案3中的响应头解决方案。
答案 1 :(得分:2)
这是我为这种情况编写的 AuthorizeAjax 操作过滤器,您可以按如下方式使用它:
[AuthorizeAjax]
public ActionResult GetNewData()
{
//controller logic here
}
通过在项目中添加以下内容,您需要的是在共享文件夹中名为“AjaxAccessError”的部分视图,个人而言,我返回指向真实登录页面的链接:)
希望这有帮助!
namespace System.Web.Mvc
{
public class AuthorizeAjaxAttribute : AuthorizeAttribute
{
private bool _failedAuthorisation;
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (!httpContext.User.Identity.IsAuthenticated)
{
_failedAuthorisation = true;
return false;
}
else
{
String[] RoleArray = Roles.Split(',');
foreach (var r in RoleArray)
{
if (httpContext.User.IsInRole(r))
{
_failedAuthorisation = false;
return true;
}
}
_failedAuthorisation = true;
return false;
}
}
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
if (_failedAuthorisation)
{
filterContext.Result = new PartialViewResult { ViewName = "AjaxAccessError" };
}
}
}
}