Asp.net Mvc自定义机制来处理未经授权的请求

对于我的网站,我希望以下行为适用于安全控制器(或操作)

如果用户将正常的请求重定向到登录页面(我很容易做到)

如果请求是Ajax类型Request.IsAjaxRequest()==true ,则返回状态码401

我怎样才能为此创建一个过滤器?


 public class MyCustomAuthorize : AuthorizeAttribute
{
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            //if ajax request set status code and end Response
            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                filterContext.HttpContext.Response.StatusCode = 401;
                filterContext.HttpContext.Response.End();
            }

            base.HandleUnauthorizedRequest(filterContext);
        }
}

创建一个如上所示的过滤器,如果请求通过ajax进行,它将返回未经授权的请求的状态码401。

如果您使用的是jQuery,您可以按照以下方式进行操作

jQuery.ajax({
statusCode: {
    401: function() {
      alert('unauthrized');
    },

  /*other options*/
});

除了被接受的答案之外,我需要将这行代码放入以防止FormsAuthentication重定向到登录页面。

filterContext.HttpContext.Response.SuppressFormsAuthenticationRedirect = true;

然后我删除了filterContext.HttpContext.Response.End();

var unauthorizedResult = new JsonResult
{
    Data = new ErrorResult() {Success = 0, Error = "Forbidden"},
            JsonRequestBehavior = JsonRequestBehavior.AllowGet
    };
    // status code
    filterContext.HttpContext.Response.StatusCode = (int) HttpStatusCode.Unauthorized;
    // return data
    filterContext.Result = unauthorizedResult;
    filterContext.HttpContext.Response.SuppressFormsAuthenticationRedirect = true;
}

您的问题不在于AJAX请求,您的问题是返回HTTP 401未经授权的响应,因为您使用表单身份验证。 此响应代码告诉框架,它应该使用HTTP 302响应将用户代理重定向到登录页面。 这就是为什么设置“正常”请求重定向很容易 - 它会自动完成。
为了回答你的问题,我遇到了类似的问题,并且我最终解决的解决方案是没有使用表单身份验证。 我实现了一个自定义授权属性,可以手动处理这两种情况。 我不确定这是否是最好的方法,但它确实有效。 我对其他人对此解决方案的看法感兴趣,或者有其他解决方案。
幸运的是,您仍然可以使用FormsAuthentication类为您处理Cookie,但必须从Web.config文件中删除表单身份验证配置。 当用户登录时,您使用FormsAuthentication.SetAuthCookie来设置一个cookie(您可能已经这样做了)。 其次,在您的授权属性中,您从请求中获取Cookie,并使用FormsAuthentication.Decrypt进行解密。 如果它存在并且有效,则基于此cookie将用户设置在HttpContext ,因为表单身份验证不会再为您执行此操作。 如果不是,你要么重定向到登录页面,要么返回401,这取决于它是否是AJAX调用。

链接地址: http://www.djcxy.com/p/12443.html

上一篇: Asp.net Mvc custom mechanism to handle unauthorized request

下一篇: Handling session timeout in ajax calls