2012-09-18 10 views
5

Sto provando a reindirizzare l'utente a un'azione diversa se il loro indirizzo email non è stato convalidato. Il fatto è che non voglio che vengano disconnessi, voglio solo reindirizzarli. Quando eseguo questa operazione in OnAuthorization per il controller, reindirizza come previsto, ma l'utente non è autenticato. Non sono sicuro del perché questo sia. Il mio codice è simile al seguente:Il reindirizzamento MVC in OnAutorizzazione causa l'esito negativo dell'autorizzazione

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

    } 

Nota: ho rimosso il codice non necessario per renderlo più chiaro. _applicationService.CurrentUser viene popolato con l'utente corrente e l'utente è stato autenticato correttamente quando arriva a quel punto. Ma dopo il reindirizzamento l'utente non è più autenticato.

Come posso ottenere questo reindirizzamento senza influire sull'autorizzazione utente integrata?

Ho provato a inserire il mio codice in OnActionExecuting, e ho anche provato a implementarlo in un ActionFilterAttribute personalizzato, ma ovunque inserissi questo reindirizzamento impedisce l''Utente' (es: System.Security.Principal .IPrincipal Controller.User) dall'ottenere l'autenticazione.

Cosa mi manca qui? Spero che questo abbia un senso. Qualsiasi aiuto molto apprezzato.

In risposta alla richiesta di Darin per la mia azione login:

[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

Puoi mostrare come stai autenticando l'utente: l'azione 'LogOn'? –

+0

@DarinDimitrov - Ho aggiunto la mia azione di login come richiesto. – soupy1976

+0

Questo è proprio quello che stavo cercando! Risparmiato un sacco di tempo – JosephDoggie

risposta

3

OK, ora ho trovato dove stavo sbagliando. Il problema era che mi veniva un po 'di un agente provocatore e io non comprendere appieno ciò che stava accadendo quando stavo facendo:

filterContext.Result = new RedirectResult(verifyEmailUrl); 

Non mi rendevo conto che sto davvero iniziando una nuova richiesta con questo, Ho erroneamente pensato che stavo semplicemente reindirizzando verso un'altra azione. Sembra ovvio ora che questa sarà una nuova richiesta.

Quindi, il problema era che la mia azione EmailVerificationRequired non autorizzava l'utente, e quindi quando arrivò a questa azione l'utente corrente era nullo. Quindi la correzione era aggiungere l'autorizzazione a quell'azione e ora va tutto bene.

Grazie per il vostro aiuto ragazzi.

0

È possibile gestire questo nel vostro ActionResult login. Prova a mettere il codice

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

subito dopo questa riga:

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

Successivamente, impostare punti di interruzione e passo attraverso l'azione di login. Se non si raggiunge la riga if (_applicationService.CurrentUser.EmailVerified! = True), significa che l'utente non è autenticato e si ha un problema diverso da affrontare.

+1

Grazie per il tuo aiuto. Il fatto è che voglio verificarlo ogni volta che si accede a qualsiasi azione che richiede l'autenticazione. In caso contrario, un utente che ha effettuato l'accesso ma non è stato verificato l'indirizzo e-mail sarebbe comunque in grado di accedere a parti del sito digitando l'URL. Ecco perché l'ho voluto in OnAuthorization, piuttosto che metterlo in azione di login. – soupy1976

+0

@ soupy1976 In base al tuo commento, ho modificato il codice di esempio per impedire all'utente di accedere a parti sicure del sito senza essere stato autenticato e avendo verificato la posta elettronica. Spero che questo ti aiuti. – Tarzan

+0

grazie ancora per il tuo aiuto Tarzan. Il problema con l'inserimento di questo controllo nell'azione di accesso è che l'utente sarebbe comunque in grado di accedere al contenuto digitando l'url nel browser (se è successo per conoscerlo o averlo salvato nella sua cronologia o qualcosa del genere). Ho bisogno di fare questo controllo nell'autorizzazione durante la richiesta effettiva della pagina, piuttosto che controllarla appena accedono altrimenti non c'è quasi nessuna sicurezza. – soupy1976

Problemi correlati