【问题标题】:Asp.net mvc 2 - Error redirecting from ActionFilter?Asp.net mvc 2 - 从 ActionFilter 重定向时出错?
【发布时间】:2009-12-16 17:01:23
【问题描述】:

mvc1 和 mvc2 有什么变化?如果用户尚未通过身份验证,我有以下代码重定向到登录页面。这不适用于 mvc2 并导致“System.Web.HttpException:发送 HTTP 标头后无法重定向”

public class RequiresAuthenticationAttribute : FilterAttribute, IAuthorizationFilter
{
  public void OnAuthorization(AuthorizationContext filterContext)
  {
    if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
    {
      string redirectOnSuccess = filterContext.HttpContext.Request.Url.AbsolutePath;
      string redirectUrl = string.Format("?ReturnUrl={0}", redirectOnSuccess);
      string loginUrl = System.Web.Security.FormsAuthentication.LoginUrl + redirectUrl;
      filterContext.HttpContext.Response.Redirect(loginUrl, true);
    }
  }
}

堆栈轨迹如下:

System.Web.HttpException: Cannot redirect after HTTP headers have been sent.
  at System.Web.HttpResponse.Redirect(String url, Boolean endResponse)
  at System.Web.HttpResponseWrapper.Redirect(String url, Boolean endResponse)
  at System.Web.Mvc.RedirectResult.ExecuteResult(ControllerContext context)
  at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
  at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass14.<InvokeActionResultWithFilters>b__11()
  at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
  at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass14.<>c__DisplayClass16.<InvokeActionResultWithFilters>b__13()
  at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult)
  at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)

【问题讨论】:

  • 一般情况下,您不要重定向到OnAuthorization。 ASP.NET 已经为您做到了。但是,再一次,MVC 也已经处理了您想使用或编写的任何提供程序的授权。如果不知道您打算重写多少以及为什么要重写,很难说您应该做什么。一般来说,我认为开发人员方式太急于重写 ASP.NET 身份验证,并且往往会做错。 blogs.teamb.com/craigstuntz/2009/09/09/38390 授权失败重定向的正确方法是在web.config 中设置URI。
  • 该站点最初是围绕 mvc1 preview 2 编写的,在 AuthorizeAttribute 创建之前。老实说,在这个问题开始出现之前,我并不知道该属性的存在。我会看看它是否能解决我需要的问题。

标签: asp.net-mvc


【解决方案1】:

您所要做的就是覆盖 HandleUnauthorizedRequest 而不是 OnAuthorization,只需将 RedirectResult url 分配给 AuthorizationContext.Result。

base.OnAuthorization 将检查身份验证,如果失败则调用 HandleUnauthorizedRequest。

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
    string redirectOnSuccess = filterContext.HttpContext.Request.Url.AbsolutePath;
    string redirectUrl = string.Format("?ReturnUrl={0}", redirectOnSuccess);
    filterContext.Result = new RedirectResult(redirectUrl);
    return;
}

【讨论】:

  • 非常好——这也帮助了我。我有 filterContext.Response.Redirect(redirectUrl),它似乎工作,但在后台抛出错误。谢谢
猜你喜欢
  • 1970-01-01
  • 2011-06-29
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 2011-01-27
  • 2011-03-27
  • 1970-01-01
  • 2012-02-08
相关资源
最近更新 更多