OnAuthorization中的MVC重定向导致授权失败

时间:2012-09-18 16:23:07

标签: c# asp.net-mvc asp.net-mvc-3 forms-authentication

如果用户的电子邮件地址尚未经过验证,我正尝试将用户重定向到其他操作。问题是,我不希望它们被注销,我只是想重定向它们。当我在OnAuthorization中为控制器执行此操作时,它会按预期重定向,但用户未经过身份验证。我不确定为什么会这样。我的代码如下所示:

    protected override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        //_applicationService.CurrentUser is populated correctly at this point
        // from Controller.User
        if (_applicationService.CurrentUser != null)
        {
            if (_applicationService.CurrentUser.EmailVerified != true)
            {
                var url = new UrlHelper(filterContext.RequestContext);
                var verifyEmailUrl = url.Action("EmailVerificationRequired", "Account", null);
                filterContext.Result = new RedirectResult(verifyEmailUrl);
            }
        }

    }

注意:我删除了不必要的代码以使其更清晰。 _applicationService.CurrentUser由当前用户填充 - 当用户到达该点时,用户已经过正确的身份验证。但在重定向之后,用户不再经过身份验证。

如何在不影响内置用户授权的情况下实现此重定向?

我已经尝试将我的代码放入OnActionExecuting,并且我也尝试在自定义ActionFilterAttribute中实现它,但是无论我在其中放置此重定向,都会阻止“用户”(即:System.Security.Principal。 IPrincipal Controller.User)获得认证。

我在这里缺少什么?希望这是有道理的。任何帮助非常感谢。

回应Darin的登录请求请求:

    [HttpPost]
    [AllowAnonymous]
    public ActionResult Login(LoginViewModel model, string returnUrl)
    {
        string errorMessage = "The username or password is incorrect";

        if (ModelState.IsValid)
        {
            if (_contextExecutor.ExecuteContextForModel<LoginContextModel, bool>(new LoginContextModel(){                    
              LoginViewModel = model  
            }))
            {
                ViewBag.CurrentUser = _applicationService.CurrentUser;
                _formsAuthenticationService.SetAuthCookie(model.LoginEmailAddress, model.RememberMe);

                if (_applicationService.IsLocalUrl(returnUrl))
                {
                    return Redirect(returnUrl);
                }

                return RedirectToAction("Index", "Home").Success("Thank you for logging in.");
            }
            else
            {
                errorMessage = "Email address not found or invalid password.";
            }
        }

        return View(model).Error(errorMessage);
    }

2 个答案:

答案 0 :(得分:3)

好的,我现在已经找到了我错的地方。问题是我有点像个笨蛋而且我没有完全理解我在做什么时发生了什么:

filterContext.Result = new RedirectResult(verifyEmailUrl);

我没有意识到我实际上正在用这个开始一个新的请求,我错误地认为我只是重定向到另一个动作。现在似乎很明显这将是一个新的请求。

所以,问题是我的EmailVerificationRequired操作没有授权用户,因此当它执行此操作时,当前用户为null。所以修复是为该操作添加授权,现在一切都很好。

感谢您的帮助。

答案 1 :(得分:0)

您可以在登录actionresult中处理此问题。尝试放置

        if (_applicationService.CurrentUser.EmailVerified != true)
        {
            FormsAuthentication.SignOut();
            return RedirectToAction("EmailVerificationRequired", "Account"); 
        }
紧接在此行之后的

代码:

_formsAuthenticationService.SetAuthCookie(model.LoginEmailAddress, model.RememberMe);      

接下来,设置断点并逐步执行Login操作。如果未到达if(_applicationService.CurrentUser.EmailVerified!= true)行,则表示您的用户未经过身份验证,并且您有其他问题需要解决。