ASP.NET MVC 身份验证失败后,返回JSON数据

正常的逻辑失败后,应该是跳转 登录页,但是: 异步请求的时候,在登录过期后,返回一个登录页,JS是识别不了的,我想返回JSON数据,应该怎样实现?

  public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (!filterContext.RequestContext.HttpContext.Request.IsAuthenticated)
            {
                // filterContext.Result = new RedirectResult("/account/login");
                    FormsAuthentication.RedirectToLoginPage();//重定向会登录页
            }
            else
            {
                //登录状态获取用户信息
                var cookie = filterContext.HttpContext.Request.Cookies[FormsAuthentication.FormsCookieName];
                var ticket = FormsAuthentication.Decrypt(cookie.Value);
                AdminModel loginUser = new AdminModel();
                loginUser = new JavaScriptSerializer().Deserialize<AdminModel>(ticket.UserData);

                filterContext.Controller.ViewData["UserName"] = loginUser.UserName;
                filterContext.Controller.ViewData["Portrait"] = loginUser.Portrait;
                filterContext.Controller.ViewData["UserID"] = loginUser.ID;
            }
            base.OnActionExecuting(filterContext);
        }
    }

一般异步请求json时,头信息中的Accept 会是text/json 或者application/json ,你可以据此判断是返回页面还是json数据。需要返回json时设置返回类型是application/json,直接网Response中写入json格式的数据就行了。

好像可以这样?记不太清了

 RedirectToAction("/login")

重定向前加入代码:

String accept = request.getHeader("Accept");
if(accept.indexOf("json")>0){
response.setContentType("application/json");
PrintWriter writer = response.getWriter();
writer.write("{\"code\":1,\"msg\":\"用户未登录或登录超时!\"}");
writer.flush();
writer.close();
return null;
}

谁知道winform帮助文档在哪里看。。。。。

异步方式,目的就是不会刷新整个页面,即使重定向成功了,登录页面也是在你指定的代替的区域中加载(AjaxOptions里面那个replace),我的做法是在控制器前加一个[Authorize]和[AllowAnonymous]标签(需要引用system.web.mvc)。

我是这样实现的, 判断了 请求的类型 : 如果是异步的请求 则返回 JSON 数据,如果是同步请求,则跳转了登录页,具体实现 见以下代码:

  if (!filterContext.RequestContext.HttpContext.Request.IsAuthenticated)
            {
                // filterContext.Result = new RedirectResult("/account/login");
                if (filterContext.HttpContext.Request.IsAjaxRequest())
                {
                    filterContext.Result = new JsonResult
                    {
                        Data = new
                        {
                            Status = -1,
                            Message = "登录已过期,请刷新页面后操作!"
                        },
                        JsonRequestBehavior = JsonRequestBehavior.AllowGet
                    };
                }
                else
                {
                    FormsAuthentication.RedirectToLoginPage();//重定向会登录页
                }

            }