2012-09-18 3 views
5

Ich versuche, den Benutzer zu einer anderen Aktion umzuleiten, wenn seine E-Mail-Adresse nicht bestätigt wurde. Die Sache ist, ich möchte nicht, dass sie ausgeloggt werden, ich möchte sie nur umleiten. Wenn ich dies in OnAuthorization für den Controller mache, leitet es wie erwartet weiter, aber der Benutzer wird nicht authentifiziert. Ich bin mir nicht sicher, warum das so ist. Mein Code sieht so aus:MVC-Umleitung in OnAuthorization bewirkt, dass die Autorisierung fehlschlägt

Hinweis: Ich habe unnötigen Code entfernt, um es klarer zu machen. _applicationService.CurrentUser wird mit dem aktuellen Benutzer gefüllt - und der Benutzer wurde korrekt authentifiziert, wenn er an diesen Punkt gelangt. Aber nach der Weiterleitung ist der Benutzer nicht mehr authentifiziert.

Wie kann ich diese Weiterleitung erreichen, ohne die integrierte Benutzerautorisierung zu beeinträchtigen?

Ich habe versucht, meinen Code in OnActionExecuting zu setzen, und ich habe auch versucht, es in einem benutzerdefinierten ActionFilterAttribute zu implementieren, aber wo auch immer ich diese Umleitung einfüge, verhindert es den 'Benutzer' (zB: System.Security.Principal .IPrincipal Controller.User) wird authentifiziert.

Was fehlt mir hier? Hoffe, das macht Sinn. Jede Hilfe wird sehr geschätzt.

Als Reaktion auf Darins Anfrage für die Anmeldungs ​​Aktion:

[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

Können Sie zeigen, wie Sie den Benutzer authentifizieren - Ihre 'LogOn' Aktion? –

+0

@DarinDimitrov - Ich habe meine Login-Aktion wie gewünscht hinzugefügt. – soupy1976

+0

Genau das habe ich gesucht! Gespeichert viel Zeit – JosephDoggie

Antwort

3

Okay, ich habe jetzt herausgefunden, wo ich falsch gelaufen bin. Das Problem war, dass ich ein bisschen ein goon wurde und ich nicht ganz verstanden, was geschah, als ich tat:

filterContext.Result = new RedirectResult(verifyEmailUrl); 

Ich wusste nicht, dass ich eigentlich fange eine neue Anforderung mit diesem, Ich dachte fälschlicherweise, dass ich gerade auf eine andere Aktion umgeleitet habe. Es scheint jetzt offensichtlich, dass dies eine neue Anfrage sein wird.

Also, das Problem war, dass meine EmailVerificationRequired Aktion den Benutzer nicht autorisierte, und daher, wenn es zu dieser Aktion kam der aktuelle Benutzer war null. Also war der Fix die Autorisierung zu dieser Aktion und jetzt ist alles in Ordnung.

Danke für Ihre Hilfe Jungs.

0

Sie können dies in Ihrem Login-Action behandeln. Versuchen Sie, den

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

Code unmittelbar nach dieser Zeile setzen:

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

Als nächsten Satz von Haltepunkte und Schritt durch die Anmeldung Aktion. Wenn Sie die Zeile if (_applicationService.CurrentUser.EmailVerified! = True) nicht erreichen, zeigt dies an, dass Ihr Benutzer nicht authentifiziert ist und Sie ein anderes Problem haben, das behoben werden muss.

+1

Danke für Ihre Hilfe. Die Sache ist, ich möchte dies jedes Mal überprüfen, wenn auf eine Aktion zugegriffen wird, die eine Authentifizierung erfordert. Sonst wäre ein Benutzer, der eingeloggt ist, aber dessen E-Mail-Adresse nicht verifiziert wurde, trotzdem in der Lage, auf Teile der Site zuzugreifen, indem er die URL eingibt. Deshalb wollte ich ihn in OnAuthorization, anstatt ihn nur in die Login-Aktion zu setzen. – soupy1976

+0

@ soupy1976 Basierend auf Ihrem Kommentar habe ich das Codebeispiel bearbeitet, um zu verhindern, dass der Benutzer auf sichere Teile der Site zugreift, ohne dass beide authentifiziert und E-Mails verifiziert sind. Hoffe das hilft. – Tarzan

+0

danke nochmal für deine Hilfe Tarzan. Das Problem mit dieser Überprüfung in der Login-Aktion ist, dass der Benutzer immer noch auf den Inhalt zugreifen kann, indem er die URL in den Browser eingibt (wenn sie es zufällig wissen oder in ihrem Verlauf gespeichert haben oder so). Ich muss diese Berechtigung während der eigentlichen Seitenanforderung einchecken, anstatt sie nur zu prüfen, wenn sie sich anmelden, sonst gibt es kaum Sicherheit. – soupy1976