2011-03-10 53 views
26

我已经使用jquery ajax函数来提交表单。 用户必须登录,否则他们必须重定向到登录页面。我已经使用了Authorize()属性。在asp.net中授权属性和jQuery AJAX MVC

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

如果用户没有登陆行动回报登录页面jQuery的AJAX功能,它显示在同一页面上,但我想将用户重定向到登录页面。 有没有解决方法?

回答

0

Ajax用于部分更新页面的内容,所以最好是在JavaScript/jquery回调代码中处理客户端的重定向。你也可以从这个post得到一些想法。

66

工作例如: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:

@Ajax.ActionLink("Get Secret", "Secret", new AjaxOptions { UpdateTargetId = "secretArea", }) 

<div id="secretArea"></div> 
+2

完全真棒罗尼!当解决方案正常工作时,我喜欢它! Ghooti需要标记这个答案... – 2013-09-24 02:25:57

+0

@BenPower感谢您的鼓励的话!我很高兴能够提供帮助。 – 2013-09-24 15:41:06

+3

获得铜牌 – 2013-10-28 23:43:35

7

只是一个方便的除了#罗尼的回答

如果你想保持页面的URL重定向上

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

更简单的解决方案imo:'urlHelper.Action'的routeValues的'returnUrl = context.HttpContext.Request.UrlReferrer.LocalPath' – 2016-06-03 23:00:53

0

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

他的解决方案不适用于webapi,但这很好,因为您可以使用普通授权 属性,然后在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 
    } 
});