如何通过从Asp.NET控制器抛出异常来重定向?
我的控制器都扩展了一个基本的UserAwareController类,它公开了GetCurrentUser()方法。如果用户尚未登录,我希望对此方法的任何调用重定向到登录页面。如何通过从Asp.NET控制器抛出异常来重定向?
我可以通过从此方法抛出一些异常来实现此目的吗?如何在抛出此异常时导致重定向发生?
虽然我认为你应该改变方法有关授权解决方案,你可以和它呆在一起,并使用此代码:
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应用程序。它包含授权逻辑,您可以在应用程序中使用它们。
您能否指示我解释授权以及如何正确使用授权关键字的链接?我不明白我如何将它绑定到我的身份验证方案(我使用开放标识)。 – ripper234 2010-04-27 17:13:49
@ 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
我尝试使用授权,它看起来很有希望,除非我遇到了这个问题:http:// *。com/questions/2724271/using -a-colon-in-return-url-with-forms-authentication-the-return-url-specif – ripper234 2010-04-27 19:45:09
为什么不直接使用Redirect
或RedirectToAction
方法来重定向到登录页面:
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也是这个话题的一个很好的参考。
在您的基本控制器中,重写OnActionExecuting。这使您可以访问ActionExecutingContext,其中包含HttpContext和响应。
然后,您可以根据您希望像这样的任何逻辑将用户重定向:
<ActionContext>.HttpContext.Response.Redirect(<Your Url>)
我忘记了上下文变量副手的名字,但它是在方法签名。
你为什么不使用'Authorize'属性?为什么你想重塑一些东西,这是非常好的。 – LukLed 2010-04-27 16:55:19
@LukLed - 嗯,我不熟悉Authorize属性,但是从我收集的内容来看,它并不是我想要的。每个用户都可以访问这个动作,他只需要登录...所以我想将他重定向到登录页面。或者我错过了Authorize如何工作? – ripper234 2010-04-27 17:01:34
在大多数情况下,它的工作原理与您所说的完全相同。如果用户未登录,他将被重定向到登录页面。 – LukLed 2010-04-27 17:03:50