1

我有一个用于 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.
}

我的操作结果中引发了异常,因为我尝试访问有关用户的信息,该信息仅在您登录时才存在。但是,我不明白为什么甚至要执行此代码,因为我有我的授权属性来保护行动。

4

3 回答 3

1

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

于 2012-09-20T19:45:23.740 回答
1
protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
{
    // Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs. 
    filterContext.Result = new HttpUnauthorizedResult();
} 

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

于 2012-08-31T18:55:53.227 回答
0

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

于 2012-08-31T18:54:15.190 回答