这个问题已经让我有些日子了,所以在寻找答案肯定与tvanfosson上面的答案一致时,我认为值得强调答案的核心部分,并解决一些相关的问题。
的核心答案是这样的,甜的和简单的:
filterContext.Result = new HttpUnauthorizedResult();
在我的情况下,我从一个基本控制器继承,所以在每一个从它继承控制器我重写OnAuthorize:
protected override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
YourAuth(filterContext); // do your own authorization logic here
}
问题是,在'YourAuth'中,我尝试了两件我认为不仅可行的事情,而且还会立即终止请求。那么,这不是它的工作原理。所以,第一,两件事情,不工作,意外:
filterContext.RequestContext.HttpContext.Response.Redirect("/Login"); // doesn't work!
FormsAuthentication.RedirectToLoginPage(); // doesn't work!
不仅那些没有工作,他们不两端的请求。这意味着:
if (!success) {
filterContext.Result = new HttpUnauthorizedResult();
}
DoMoreStuffNowThatYouThinkYourAuthorized();
好了,即使有以上正确答案,逻辑流依然延续!您仍然会在OnAuthorize中点击DoMoreStuff ...。所以请记住(DoMore ...应该在其他地方)。
但有了正确的答案,虽然OnAuthorize逻辑流程一直持续到结束,然后你确实得到你所期望的:重定向到你的登录页面(如果你在你的webconfig中有一个设置在Forms auth中) 。
但出乎意料的是, 1)的Response.Redirect( “/登录”)不工作:操作方法仍然被调用,并 2)FormsAuthentication.RedirectToLoginPage();做同样的事情:Action方法仍然被调用!
对我来说,这似乎完全错误,特别是对于后者:谁会认为FormsAuthentication.RedirectToLoginPage不会结束请求,或者执行上述filterContext.Result = new HttpUnauthorizedResult()的等价操作?
我不认为有一个我可以去的链接,这个链接把它分解成更容易遵循推理? – Maslow 2010-01-18 02:12:16