【发布时间】: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