2012-09-18 14 views
5

電子メールアドレスが検証されていない場合、ユーザーを別のアクションにリダイレクトしようとしています。ことは、私はそれらがログアウトされることを望んでいない、私はちょうどそれらをリダイレクトしたいです。コントローラのOnAuthorizationでこれを行うと、期待どおりにリダイレクトされますが、ユーザーは認証されません。なぜこのことが分かりませんか?私のコードは次のようになります:OnAuthorizationのMVCリダイレクトにより、認証が失敗する

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でも実装しようとしましたが、このリダイレクトをどこに置いても 'User'(つまり、System.Security.Principal .IPrincipal Controller.User)が認証されるのを防ぎます。

私はここで何が欠けていますか?これが理にかなってほしい。どんな助けでも大歓迎です。私のログインアクションのためのダーリンの要求に応じて

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

あなたはあなたの 'LogOn'アクションをどのように認証していますか? –

+0

@DarinDimitrov - 私はログインアクションを要求通りに追加しました。 – soupy1976

+0

これは私が探していたものです!多くの時間を節約 – JosephDoggie

答えて

3

さて、私はどこに間違っていたのか分かりました。問題は、私は暴力団員のビットされていたと私はやっていたとき、私は完全に何が起こっているか理解していなかったということであった:

filterContext.Result = new RedirectResult(verifyEmailUrl); 

私は実際にこれを使用して新しい要求を始めていますことを認識していませんでした、私は誤って別の行動にリダイレクトしていると思った。これが新しい要求になることは明らかです。

したがって、私のEmailVerificationRequiredアクションがユーザーを認証していないという問題がありました。したがって、このアクションに達した時点で、現在のユーザーはnullでした。だから修正は、そのアクションに権限を追加し、今それはすべていいです。

あなたの助けを借りてくれてありがとう。

0

あなたのログインのActionResultにこれを処理することができます。

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

次に、ブレークポイントを設定をしてログインアクションをステップ実行:この行の直後

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

コードを配置してみてください。 if(_applicationService.CurrentUser.EmailVerified!= true)に達していない場合は、ユーザーが認証されておらず、別の問題に対処していることを示します。

+1

おかげさまで、ありがとうございます。問題は、認証が必要なアクションが実行されるたびにこれをチェックすることです。それ以外の場合は、ログインしたがメールアドレスが確認されていないユーザーは、URLを入力することでサイトの一部にアクセスすることができます。そのため、ログインアクションに入れるのではなく、OnAuthorizationで使用します。 – soupy1976

+0

@ soupy1976あなたのコメントに基づいて、コードサンプルを編集して、ユーザーが認証されずに電子メールが確認されることなく、サイトの安全な部分にアクセスできないようにしました。お役に立てれば。 – Tarzan

+0

あなたの助けTarzanにもう一度感謝します。このチェックをログイン操作に入れることの問題は、ブラウザーにURLを入力することによってユーザーがコンテンツにアクセスできるようになることです(ブラウザーが知っていたか、履歴に保存されている場合)。私は実際のページリクエストの間に認証でこのチェックを行う必要があります。 – soupy1976

関連する問題