Ajax Authorize属性允许执行ActionResult代码

Ajax Authorize属性允许执行ActionResult代码,ajax,asp.net-mvc,authorization,actionresult,Ajax,Asp.net Mvc,Authorization,Actionresult,我有一个自定义属性,用于Ajax请求,以防止发生默认的FormsAuthentication工作流(因为它对Ajax请求没有意义) 这是自定义授权属性: public class AjaxAuthorize : AuthorizeAttribute { protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { UrlHelper urlHelper;

我有一个自定义属性,用于Ajax请求,以防止发生默认的FormsAuthentication工作流(因为它对Ajax请求没有意义)

这是自定义授权属性:

public class AjaxAuthorize : AuthorizeAttribute {
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) {
        UrlHelper urlHelper;

        if (filterContext.HttpContext.Request.IsAjaxRequest()) {
            urlHelper = new UrlHelper(filterContext.RequestContext);

            filterContext.HttpContext.Response.StatusCode = 401;
            //Don't let IIS7 be mean.
            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
            //Return JSON which tells the client where the login page exists if the user wants to authenticate.
            filterContext.HttpContext.Response.Write(new JavaScriptSerializer().Serialize(
                new {
                    LoginUrl = string.Format("{0}?ReturnURL={1}", FormsAuthentication.LoginUrl, urlHelper.Encode(filterContext.HttpContext.Request.Url.PathAndQuery))
                }
            ));
            filterContext.HttpContext.Response.End();
        } else {
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
}
我的ActionResult使用自定义授权属性修饰,如下所示:

[HttpPut]
[ValidateInput(false)]
[AjaxAuthorize]
public ActionResult Comment(string id, string comment) {
    //stuff happens here.
}

在我的操作结果中引发了一个异常,因为我试图访问有关用户的信息,这些信息只有在您登录时才会存在。但是,我不明白为什么要执行此代码,因为我有保护操作的授权属性。

尝试调用
base.HandleUnauthorizedRequest(filterContext)在IF块内。或者只需删除ELSE块并始终调用
base.HandleUnauthorizedRequest(filterContext)


这是HandleUnauthorizedRequest的默认实现。您可能需要分配包含所需JSON和有效状态代码的自定义ActionResult。我不确定从HTTP上下文直接处理请求对象是否有效。

我最终返回了一个HTTP 418(我一直想使用它一段时间),因此表单身份验证模块没有拦截请求。然后在我的脚本中查找该状态代码,并将其作为未经授权的请求处理,然后执行正确的重定向。

现有的
AuthorizeCore
已返回false,因为用户未经身份验证。很抱歉,答案已被编辑。以前的答案版本包含的代码方法返回true。如何阻止表单身份验证模块启动?我只想返回JSON,而不是重定向到登录页面。请尝试在web.config中将其关闭。我可能没有把问题说得足够清楚。我希望重定向发生,只是不针对XML HTTP请求。这不是您可能要寻找的答案,但我会尝试再次启动此方法,只调用基本方法,然后逐步调试并添加代码,以确定是哪个命令导致其失败。我使用了419身份验证超时(不在RFC 2616中)。这帮助我走上了正确的道路。我知道这是一条非常古老的线索,但你找到答案了吗?@BhargavKonda是的,请查看我贴在问题上的答案。
protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
{
    // Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs. 
    filterContext.Result = new HttpUnauthorizedResult();
}