在ajax请求期间处理MVC表单身份验证到期

时间:2011-06-28 14:34:01

标签: c# jquery ajax asp.net-mvc-3

在我的MVC3应用程序中,有几种情况我会通过jQuery的ajax方法显示启动画面动态加载局部视图并将html注入DOM。

问题是如果身份验证过期然后用户启动ajax调用,被调用的操作将重定向到登录页面,因此返回登录页面的html并将其注入DOM,这显然正在进行对用户来说非常困惑。

人们通常如何应对这种情况?我认为这是常见的,因为表单auth和ajax对html的请求是我做了很多的事情。

2 个答案:

答案 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" };
            }
        }
    }
}