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

THX*_*138 13 asp.net-mvc

我有一个用两个自定义ActionFilterAttribute修饰的方法.

[RequiresAuthentication(Order = 1)]
[ToonAction(Order = 2)]
public ActionResult Browse(...
Run Code Online (Sandbox Code Playgroud)

RequiresAuthentication属性来自这篇文章

在RequiresAuthentication内部,OnActionExecuting我做:

 filterContext.HttpContext.Response.Redirect(loginUrl, true);
Run Code Online (Sandbox Code Playgroud)

该行执行,参数全部按预期执行.问题是在执行上面的行后,我得到了下一个属性(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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

tva*_*son 27

您希望将filterContext上的Result设置为RedirectResult,而不是对响应进行重定向.

 filterContext.Result = new RedirectResult { Url = loginUrl };
Run Code Online (Sandbox Code Playgroud)

编辑:正如@Hunter Daley建议的更好的机制是使用AuthorizeAttribute,如果它适合你.如果您确实具有AuthorizeAttribute不起作用的身份验证/授权方案,则从它派生自定义属性而不是更通用的ActionFilterAttribute可能会更好.无论如何,正确的技术是设置结果而不是直接与Response交互.您可能需要查看http://www.codeplex.com/aspnet上的实际AuthorizeAttribute源以获取相关信息.

我的博客http://farm-fresh-code.blogspot.com上也有自定义授权代码示例.