如何通过从Asp.NET控制器抛出异常来重定向?

问题描述:

我的控制器都扩展了一个基本的UserAwareController类,它公开了GetCurrentUser()方法。如果用户尚未登录,我希望对此方法的任何调用重定向到登录页面。如何通过从Asp.NET控制器抛出异常来重定向?

我可以通过从此方法抛出一些异常来实现此目的吗?如何在抛出此异常时导致重定向发生?

+3

你为什么不使用'Authorize'属性?为什么你想重塑一些东西,这是非常好的。 – LukLed 2010-04-27 16:55:19

+0

@LukLed - 嗯,我不熟悉Authorize属性,但是从我收集的内容来看,它并不是我想要的。每个用户都可以访问这个动作,他只需要登录...所以我想将他重定向到登录页面。或者我错过了Authorize如何工作? – ripper234 2010-04-27 17:01:34

+1

在大多数情况下,它的工作原理与您所说的完全相同。如果用户未登录,他将被重定向到登录页面。 – LukLed 2010-04-27 17:03:50

虽然我认为你应该改变方法有关授权解决方案,你可以和它呆在一起,并使用此代码:

public partial class BaseUserAwareController : Controller 
{ 
    protected override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (GetCurrentUser() == null) 
     { 
      filterContext.Result = new HttpUnauthorizedResult(); 
     } 
    } 
} 

如果你的项目是不是太大了,想想将其更改为使用[Authorize]。如果你使用它,那也只能是:

[Authorize] 
public partial class UserAwareController : Controller 
{ 

} 

你可能会认为这不是很大的区别,但也[Authorize]处理一些缓存问题(返回缓存的响应,当你不再被授权)。

安装MVC 2并创建新的MVC 2 Web应用程序。它包含授权逻辑,您可以在应用程序中使用它们。

+0

您能否指示我解释授权以及如何正确使用授权关键字的链接?我不明白我如何将它绑定到我的身份验证方案(我使用开放标识)。 – ripper234 2010-04-27 17:13:49

+0

@ ripper234:这里是一篇关于FormsAuthentication的文章,以及您使用[Authorize]属性必须做的事情:http://blog.codevelop.dk/post/2007/11/24/ASPNET-20-Forms-authentication-Keeping -it-customized-yet-simple.aspx你可以修改它来使用OpenId。 – LukLed 2010-04-27 17:33:05

+0

我尝试使用授权,它看起来很有希望,除非我遇到了这个问题:http:// *。com/questions/2724271/using -a-colon-in-return-url-with-forms-authentication-the-return-url-specif – ripper234 2010-04-27 19:45:09

为什么不直接使用RedirectRedirectToAction方法来重定向到登录页面:

public ActionResult GetCurrentUser() 
{ 
    if (user is not logged in) 
    { 
     Redirect("/LoginPage"); 
    } 
} 

编辑:还是做检查的基本控制器OnActionExecuting:

public class BaseController : Controller 
{ 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (GetCurrentUser() == null) 
     { 
      (filterContext.Controller as BaseController).Redirect("/Login"); 
     } 

     base.OnActionExecuting(filterContext); 
    } 

}

http://forums.asp.net/t/1239842.aspx也是这个话题的一个很好的参考。

+0

如果动作不需要调用GetCurrentUser会怎么样? – LukLed 2010-04-27 17:06:33

+0

他没有要求这种情况下,只是如果GetCurrentUser被称为 – amurra 2010-04-27 17:12:07

+0

是否重定向抛出异常?我不想重复在每个方法中检查“if(GetCurrentUser()== null)重定向”的代码。我更喜欢使用“GetCurrentUser()”,如果没有'当前用户',那么我想要一个重定向操作(通过异常)。 – ripper234 2010-04-27 17:14:48

在您的基本控制器中,重写OnActionExecuting。这使您可以访问ActionExecutingContext,其中包含HttpContext和响应。

然后,您可以根据您希望像这样的任何逻辑将用户重定向:

<ActionContext>.HttpContext.Response.Redirect(<Your Url>) 

我忘记了上下文变量副手的名字,但它是在方法签名。