从未授权请求重定向到新视图

时间:2014-03-29 22:31:45

标签: asp.net-mvc asp.net-mvc-3

我想重定向到视图,但视图正在[Authorize]属性所在的局部视图中加载。

除了response.redirect还有其他什么吗?

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAuthenticated)
        {
            string authUrl = this.redirectUrl; //passed from attribute NotifyUrl Property

            //if null, get it from config
            if (String.IsNullOrEmpty(authUrl))
            {
                authUrl = System.Web.Configuration.WebConfigurationManager.AppSettings["RolesAuthRedirectUrl"]; 
            }
            if (!String.IsNullOrEmpty(authUrl))
            {

                filterContext.HttpContext.Response.Redirect(authUrl); 
            }


        }

        base.HandleUnauthorizedRequest(filterContext);
    }




[AuthorizeUsers(Roles = "Administrator", NotifyUrl = "/CustomErrors/Error404")]
    public ActionResult addToCart(int ProductID, string Quantity)
    {

         ...
    }

1 个答案:

答案 0 :(得分:1)

您似乎正在使用AJAX调用调用使用此Authorize属性修饰的控制器操作。如果用户未获得授权,您希望完全重新加载页面。

Phil Haack撰写了一篇非常好的博客文章,说明了如何实现这一目标:http://haacked.com/archive/2011/10/04/prevent-forms-authentication-login-page-redirect-when-you-donrsquot-want.aspx/

这个想法很简单。由于您对此控制器操作发出了AJAX请求,因此从部分移出的唯一方法是使用javascript进行重定向。因此,例如,您的AJAX代码可以检测控制器操作是否返回401 HTTP状态代码,然后使用window.location.href重定向到登录页面:

$.ajax({
    url: '/protected',
    type: 'POST',
    statusCode: {
        200: function (data) {
            // Success
        },
        401: function (data) {
            // Handle the 401 error here.
            window.location.href = '/login'
        }
    }
});

这里唯一的困难是如何使标准的Authorize属性返回401而不是尝试重定向到登录页面。 Phil Haack说明了AspNetHaack NuGet实现了这个目标。