【问题标题】:Authorize attribute is letting ActionResult code executeAuthorize 属性让 ActionResult 代码执行
【发布时间】:2012-08-31 18:37:07
【问题描述】:

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

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

【问题讨论】:

  • 我知道这是一个非常古老的线程,但你找到答案了吗。
  • @BhargavKonda 是的,请查看我发布的问题的答案。

标签: ajax asp.net-mvc authorization actionresult


【解决方案1】:
protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
{
    // Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs. 
    filterContext.Result = new HttpUnauthorizedResult();
} 

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

【讨论】:

  • 现有的AuthorizeCore 已经返回 false,因为用户未通过身份验证。
  • 抱歉,已编辑答案。以前的答案版本包含假设 AuthorizeCode 方法返回 true。
  • 如何阻止表单身份验证模块启动?我只想返回 JSON,而不是重定向到登录页面。
  • 尝试在 web.config 中关闭它。
  • 我的问题可能不够清楚。我希望重定向发生,而不是 XML HTTP 请求。
【解决方案2】:

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

【讨论】:

  • 我使用了 419 身份验证超时(不在 RFC 2616 中)。这帮助我走上了正轨。
【解决方案3】:

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

【讨论】:

  • 这不是您可能正在寻找的答案,但我会尝试再次启动此方法,仅调用基本方法,然后逐步调试并添加您的代码以准确识别哪个命令是导致它失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 2014-05-30
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多