在asp.net MVC 4中授权ajax请求的属性

时间:2014-01-02 17:29:19

标签: ajax asp.net-mvc asp.net-mvc-4 authentication

我有一个动作方法并使用像这样的ajax发布到它:

 $.ajax({
                    url: "/GetSearchCriteria",
                    type: "GET",  //these is must               
                    cache: false,  //these is for IE
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    data: {
                        VehicleId : vehicleId                      
                    },
                }).done(function (data) {
                        debugger;                  


                        $('#myModal').modal('show');                   

                });

我已经定义了这样的动作方法:

  [AjaxAuthorize]
        [GET("GetSearchCriteria")]
        public ActionResult GetSearchCriteria(VehicleSearchModel model)
        {

            return Json(model , JsonRequestBehavior.AllowGet);
        }

和像这样的ajax请求的Authorize方法:

 public class AjaxAuthorizeAttribute : AuthorizeAttribute
    {
        protected override void HandleUnauthorizedRequest(AuthorizationContext context)
        {
            if (context.HttpContext.Request.IsAjaxRequest())
            {
                var urlHelper = new UrlHelper(context.RequestContext);
                context.HttpContext.Response.StatusCode = 403;
                context.Result = new JsonResult
                {
                    Data = new
                    {
                        Error = "NotAuthorized",
                        LogOnUrl = "/Login" //urlHelper.Action("LogOn", "Account")
                    },
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };
            }
            else
            {
                base.HandleUnauthorizedRequest(context);
            }
        }
    }

然后这个javacript代码:

  $(function () {
            $(document).ajaxError(function (e, xhr) {
                debugger;
                if (xhr.status == 403) {
                    var response = $.parseJSON(xhr.responseText);
                    window.location = response.LogOnUrl;
                }
            });
        });

1)。我发现大多数时候这个授权属性都没有被击中。 2)。即使它被命中,然后用户被重定向到逻辑页面,但没有返回URL被追加到url。 3)。任何用户都可以登录(即使他没有被授权登录。我只希望有角色客户的用户以其他方式登录,将他们重定向到非授权页面。

请建议如何操作。

2 个答案:

答案 0 :(得分:0)

请确保[Authorize]级别没有常规Controller属性。

因为如果是这样,您的自定义[AjaxAuthorize]将不会被点击。

答案 1 :(得分:-1)

将AttributeUsage添加到您的班级:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class,
                AllowMultiple = false, Inherited = true)]
public class AjaxAuthorizeAttribute : AuthorizeAttribute { ... }