在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 } });