我有一个用两个自定义ActionFilterAttribute修饰的方法。
[RequiresAuthentication(Order = 1)]
[ToonAction(Order = 2)]
public ActionResult Browse(...
RequiresAuthentication
属性来自this article
Inside RequiresAuthentication,OnActionExecuting我做:
filterContext.HttpContext.Response.Redirect(loginUrl, true);
行被执行,参数全部按预期执行。问题是在执行上面的行后,我得到了下一个属性(ActionFilterAttribute),好像重定向不起作用,它只是继续执行请求,而不是简单地重定向浏览器。
问题:我还需要做什么来制作请求处理程序
这是一个完整的方法:
public override void OnActionExecuting(ActionExecutingContext filterContext) {
//redirect if not authenticated
var identity = filterContext.HttpContext.User.Identity;
if (!identity.IsAuthenticated) {
//use the current url for the redirect
string redirectOnSuccess = filterContext.HttpContext.Request.Url.PathAndQuery;
//send them off to the login page
string redirectUrl = string.Format("?ReturnUrl={0}", redirectOnSuccess);
string loginUrl = FormsAuthentication.LoginUrl + redirectUrl;
filterContext.HttpContext.Response.Redirect(loginUrl, true);
// filterContext.Result = new HttpUnauthorizedResult();
// filterContext.HttpContext.Response.StatusCode = 0x191;
}
}
答案 0 :(得分:26)
您希望将filterContext上的Result设置为RedirectResult,而不是对响应进行重定向。
filterContext.Result = new RedirectResult { Url = loginUrl };
编辑:正如@Hunter Daley建议的更好的机制是使用AuthorizeAttribute,如果它适合你。如果您确实具有AuthorizeAttribute不起作用的身份验证/授权方案,则从它派生自定义属性而不是更通用的ActionFilterAttribute可能会更好。无论如何,正确的技术是设置结果而不是直接与Response交互。您可能希望在http://www.codeplex.com/aspnet查看实际的AuthorizeAttribute源以获取提示。
我的博客custom authorization上也有http://farm-fresh-code.blogspot.com代码示例。
答案 1 :(得分:2)
尝试将[Authorize]属性添加到Action方法
答案 2 :(得分:2)
添加
filterContext.HttpContext.Response.Clear();
起初 这在结束时:
filterContext.HttpContext.Response.End();
希望这有帮助。
答案 3 :(得分:0)
return RedirectToAction("Index", "Home/Login", new {area = "", returnURL = Request.Url.AbsolutePath});
停止当前处理,重定向到所需(登录)页面并退出操作。
如果您在任何区域,则需要area
路线属性才能离开当前区域。
答案 4 :(得分:0)
在重定向页面之前添加此代码。
filterContext.ExceptionHandled = true;