【问题标题】:ASP:NET MVC custom AuthorizeAttribute filterContext.result not workingASP:NET MVC 自定义 AuthorizeAttribute filterContext.result 不起作用
【发布时间】:2014-07-18 06:58:47
【问题描述】:

我正在尝试为这样的 AJAX 请求创建自定义 AuthorizeAttribute

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AjaxAuthorizeAttribute: AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAjaxRequest()) 
        {
            JsonResult result = new JsonResult();
            result.Data = new { status = "unauthorized", redirect = FormsAuthentication.LoginUrl };
            filterContext.Result = result;
            //filterContext.HttpContext.Response.StatusCode = 401;
            filterContext.HttpContext.Response.ContentType = "application/json";
            filterContext.HttpContext.Response.End();
            Debug.WriteLine(result.ToString());
            return;
        }
        base.HandleUnauthorizedRequest(filterContext);
    }

但是,JSONResult 出于某种原因从未写入 HTTP 响应。我做错了什么?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 authorization


    【解决方案1】:

    我不确定这是否是解决此问题的正确方法,但它对我有用:我没有将 JSONResult 添加到 filterContext,而是将 JSON 字符串直接写入 HTTP 响应,如下所示:

    filterContext.HttpContext.Response.ContentType = "application/json";
    string json =  new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(result.Data);
    filterContext.HttpContext.Response.Write(json);
    filterContext.HttpContext.Response.End(); 
    

    【讨论】:

      【解决方案2】:

      如果需要初始化filterContext.Result,那么AuthorizeCore必须返回true。例如:

      private ActionResult _unAuthorizedResult;
      
      protected override bool AuthorizeCore(HttpContextBase httpContext)
      {
              try
              {
                  if (!httpContext.User.Identity.IsAuthenticated)
                      return false;
      
                  var allow = PrivateMethod_CheckAllow();
      
                  if (!allow && NeedReturnActionResult())
                  {
                      _unAuthorizedResult = GetNotAllowActionResult();
                      return true;
                  }
      
                  return allow;
              }
              catch (AuthorizeException)
              {
                  return base.AuthorizeCore(httpContext);
              }
      }
      
      public override void OnAuthorization(AuthorizationContext filterContext)
      {
          base.OnAuthorization(filterContext);
      
          if (_unAuthorizedResult != null)
          {
              filterContext.Result = _unAuthorizedResult;
              filterContext.HttpContext.Response.StatusCode = (int) HttpStatusCode.Forbidden;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2020-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-23
        • 2012-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多