我想重定向到视图,但视图正在[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)
{
...
}
答案 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实现了这个目标。