5

メールアドレスが検証されていない場合、ユーザーを別のアクションにリダイレクトしようとしています。問題は、それらをログアウトさせたくない、ただリダイレクトしたいということです。コントローラの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)ができなくなります。ユーザー)認証を受けることから。

ここで何が欠けていますか?これが理にかなっていることを願っています。どんな助けでも大歓迎です。

ダリンのログインアクションのリクエストに応えて:

    [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);
    }
4

2 に答える 2

3

さて、私はどこが間違っていたのかを見つけました。問題は、私が少しおかしなことをしていて、自分がやっているときに何が起こっているのかを完全には理解していなかったことです。

filterContext.Result = new RedirectResult(verifyEmailUrl);

これで実際に新しいリクエストを開始していることに気づきませんでした。別のアクションにリダイレクトしているだけだと誤って考えました。これが新しい要求になることは明らかです。

したがって、問題は、私のEmailVerificationRequiredアクションがユーザーを承認していなかったため、このアクションに到達したときに現在のユーザーが null だったことです。したがって、修正はそのアクションに承認を追加することであり、今ではすべて問題ありません。

助けてくれてありがとう。

于 2012-09-21T10:33:14.870 に答える
0

これは、ログインアクション結果で処理できます。配置してみてください

        if (_applicationService.CurrentUser.EmailVerified != true)
        {
            FormsAuthentication.SignOut();
            return RedirectToAction("EmailVerificationRequired", "Account"); 
        }

この行の直後のコード:

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

次に、ブレークポイントを設定し、ログインアクションを実行します。if(_applicationService.CurrentUser.EmailVerified!= true)行に到達しない場合は、ユーザーが認証されていないことを示しており、対処すべき別の問題があります。

于 2012-09-18T20:57:14.697 に答える