【问题标题】:Asp.net MVC AuthorizationFilter and AjaxRequestsAsp.net MVC 授权过滤器和 Ajax 请求
【发布时间】:2013-04-12 08:18:35
【问题描述】:

我有一个授权过滤器类:

public class ValidateSessionTokenFilter : IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAjaxRequest())
        {
            filterContext.Result = new JsonResult
            {
                Data = new { Message = "Session timeout" },
                JsonRequestBehavior = JsonRequestBehavior.AllowGet
            };
            filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
        }
    }
}

过滤器有效,但问题是即使我强制返回类型为JsonResult 结果,框架总是返回一个重定向到登录页面。

有没有办法防止这种行为?

【问题讨论】:

  • if 块后是否有代码
  • 它是,但对于示例并不重要
  • 但可能有助于更好地理解

标签: asp.net-mvc asp.net-mvc-4 action-filter


【解决方案1】:

当您返回 401 时,这是表单身份验证的默认行为。Afaik 没有 设置为在 .Net

if (context.Response.StatusCode==4100)
 {
       context.Response.StatusCode=401;
  }

【讨论】:

    【解决方案2】:

    这是 HttpStatusCode.Unauthorized 的 MVC 问题,它总是重定向。我们通过返回自定义错误代码来“修复”这个问题。

    附言如果你真的需要这个,我可以找到负责这个的代码女巫。

    【讨论】:

    • 我需要状态码 401 才能从客户端正确处理它。但是,我找到了一个解决方法:我需要禁止表单身份验证重定向。 filterContext.HttpContext.Response.SuppressFormsAuthenticationRedirect = true;
    • 在Action中设置状态码401后可以调用HttpContext.Response.End();。为 MVC 5.2.2.0 工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 2017-04-08
    • 1970-01-01
    • 2014-07-18
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多