我正在使用jquery对asp.net mvc控制器操作进行ajax调用:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult GetWeek(string startDay)
{
var daysOfWeek = CompanyUtility.GetWeek(User.Company.Id, startDay);
return Json(daysOfWeek);
}
当会话超时时,此调用将失败,因为用户对象存储在会话中。我创建了一个自定义的authorize属性,以便检查会话是否丢失并重定向到登录页面。这适用于页面请求,但不适用于ajax请求,因为您不能从ajax请求重定向:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AuthorizeUserAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (!httpContext.Request.IsAjaxRequest())
{//validate http request.
if (!httpContext.Request.IsAuthenticated
|| httpContext.Session["User"] == null)
{
FormsAuthentication.SignOut();
httpContext.Response.Redirect("~/?returnurl=" + httpContext.Request.Url.ToString());
return false;
}
}
return true;
}
}
我在另一个线程上读到,当用户未通过身份验证而您发出ajax请求时,您应该将状态代码设置为401 (未授权),然后在js中检查并将其重定向到登录页面。然而,我不能让它工作:
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (Request.IsAjaxRequest() && (!Request.IsAuthenticated || User == null))
{
filterContext.RequestContext.HttpContext.Response.StatusCode = 401;
}
else
{
base.OnActionExecuting(filterContext);
}
}
基本上,它会将其设置为401,但随后它将继续执行控制器操作,并抛出一个未设置为对象错误实例的对象ref,然后将错误500返回给客户端js。如果我更改自定义Authorize属性来验证ajax请求,并为那些未经过身份验证的请求返回false,这将使ajax请求返回我的登录页面,这显然是不起作用的。
我该如何让它工作呢?
https://stackoverflow.com/questions/5238854
复制相似问题