在asp.net MVC中授权属性和jQuery AJAX

我用jQuery的ajax函数来提交表单。 用户必须login,否则他们必须redirect到login页面。我已经使用了Authorize()属性。

[Authorize] public ActionResult Creat() { .... } 

如果用户没有login到jQuery的ajax函数的动作返回login页面,它显示在同一页面,但我想redirect用户login页面。 有没有解决办法?

工作示例: https : //github.com/ronnieoverby/mvc-ajax-auth

重要部分:

AjaxAuthorizeAttribute:

 using System.Web.Mvc; namespace MvcApplication1 { 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 = urlHelper.Action("LogOn", "Account") }, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; } else { base.HandleUnauthorizedRequest(context); } } } } 

使用Javascript:

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

使用控制器中的属性:

  [AjaxAuthorize] public ActionResult Secret() { return PartialView(); } 

做一些阿贾克斯:

 @Ajax.ActionLink("Get Secret", "Secret", new AjaxOptions { UpdateTargetId = "secretArea", }) <div id="secretArea"></div> 

#罗尼的答案只是一个方便的补充

如果你想保持页面的URLredirect。

  var pathname = window.location.pathname; if (xhr.status == 403) { var response = $.parseJSON(xhr.responseText); window.location = response.LogOnUrl + '?ReturnUrl=' + pathname; } 

Ajax用于部分更新页面的内容,所以最好在你的客户端处理这个redirect,在你的javascript / jquerycallback代码中。 你也可以从这个post得到一些想法。

作为Ronnie Overby的回答的另一个扩展。

他的解决scheme不适用于webapi,但是这很好,因为您可以使用普通的Authorize属性,然后在ajaxError函数中处理401状态,如下所示。

  $(document).ajaxError(function (e, xhr) { //ajax error event handler that looks for either a 401 (regular authorized) or 403 (AjaxAuthorized custom actionfilter). if (xhr.status == 403 ||xhr.status == 401) { //code here } });