ASP.NET MVC:Response.Redirect(url,TRUE)不会停止请求处理

时间:2010-02-02 20:13:15

标签: asp.net-mvc

我有一个用两个自定义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;
        }
    }

5 个答案:

答案 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;