加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – Asp.net mvc 2 – 从ActionFilter重定向错误?

发布时间:2020-12-16 09:31:14 所属栏目:asp.Net 来源:网络整理
导读:从mvc1和mvc2改变了什么?如果用户未经过身份验证,我有以下代码重定向到登录页面.这不适用于mvc2并导致“System.Web.HttpException:在发送HTTP标头后无法重定向” public class RequiresAuthenticationAttribute : FilterAttribute,IAuthorizationFilter{ p
从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)

解决方法

您所要做的就是覆盖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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读