这个问题困扰了我好几天,因此在找到与上述特凡福森的答案肯定相符的答案时,我认为有必要强调答案的核心部分,并解决一些相关的问题。
核心答案是这样,简单而甜蜜:
filterContext.Result = new HttpUnauthorizedResult();
在我的情况下,我从基本控制器继承,因此在从其继承的每个控制器中,我都重写OnAuthorize:
protected override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
YourAuth(filterContext);
}
问题是,在“ YourAuth”中,我尝试了两项我认为不仅可以起作用,而且会立即终止请求的事情。好吧,这不是它的工作原理。因此,首先,两件事不起作用,出乎意料:
filterContext.RequestContext.HttpContext.Response.Redirect("/Login");
FormsAuthentication.RedirectToLoginPage();
这些不仅无效,而且也不会结束请求。这意味着:
if (!success) {
filterContext.Result = new HttpUnauthorizedResult();
}
DoMoreStuffNowThatYouThinkYourAuthorized();
好吧,即使上面给出了正确的答案,逻辑流程仍然继续!您仍将在OnAuthorize中点击DoMoreStuff...。因此,请记住这一点(因此,DoMore ...应该位于其他位置)。
但是有了正确的答案,虽然OnAuthorize逻辑流程一直持续到最后,但之后您确实会得到预期的结果:重定向到登录页面(如果您在webconfig中的Forms auth中设置了一个)。
但出乎意料的是,1)Response.Redirect(“ / Login”)不起作用:Action方法仍被调用,以及2)FormsAuthentication.RedirectToLoginPage(); 做同样的事情:Action方法仍然被调用!
这对我来说似乎是完全错误的,尤其是对于后者:谁会想到FormsAuthentication.RedirectToLoginPage不会结束请求,或者是否等同于filterContext.Result = new HttpUnauthorizedResult()的作用?