2016-02-02 1 views
0

J'essaie donc de recycler du code qui était pour un code derrière l'application .NET à motifs pour mon MVC app et la classe Authenticate qu'ils ont utilisée. Comment la méthode Index de SignInController basée sur le code qu'ils m'ont donné est censé fonctionner est d'appeler une méthode de classe Authentifier dans le else if qui obtient un jeton et redirige vers la méthode d'index à quel point puisque l'application a maintenant un jeton, il va dans le premier if conditionnel et une méthode différente dans le précité authentifier valide le jeton. Puisque les utilisateurs ne commenceront pas avec un jeton, le else if sera toujours plongé en premier. Afin d'apaiser l'erreur "Tous les chemins de code retournent une valeur", je dois ajouter une instruction return à la fin de la clause else if et une clause else. Toutefois, si l'index return null n'est pas redirigé comme confirmé par les points d'arrêt. Cependant, si je fais return RedirectToAction("Index", "SignIn");, je reçois une erreur à propos de "Impossible de rediriger après que les en-têtes HTTP ont été envoyés", ce que je soupçonne parce que l'appel Redirect de la classe Authenticate n'a pas encore été terminé. Cependant, je suis en désaccord sur la façon de remédier à la situation, car soit la valeur de retour ne parvient pas à rediriger l'application web vers l'index ..."Impossible de rediriger après l'envoi des en-têtes HTTP", mais Response.Redirect ne fonctionne pas si je supprime RedirectToAction

Code ".NET" original que je suis en train de recycler app d'un collègue:

if (string.IsNullOrEmpty(HttpContext.Current.User.Identity.Name) && HttpContext.Current.Request.QueryString["Token"] != null) 
{ 
// we’ve got a token, they must have logged in .. double-check the token 
string ssoToken = HttpContext.Current.Request.QueryString["Token"].ToString(); 
string userRoles = string.Empty; 
    if (Authenticate.ValidateSSOToken(ssoToken, out userRoles)) 
    { 
     string userName = HttpContext.Current.User.Identity.Name; 
     ((BaseApplicationPage)(this.Page)).CurrentSecurity.SetUser(userName, "", userRoles); 
     RedirectOnSuccess(); 

    } 
    else 
    { 
     RedirectToForbiddenPage(); 
    } 
} 
else if(string.IsNullOrEmpty(HttpContext.Current.User.Identity.Name)) 
{ 
    // no user data..go ask them to get SSOToken from service 
    Authenticate.isUserAuthenticated(); 
} 

Ma tentative de reformater dans une application .NET MVC style:

 public ActionResult Index() 
     { 
      if (string.IsNullOrEmpty(System.Web.HttpContext.Current.User.Identity.Name) && System.Web.HttpContext.Current.Request.QueryString["Token"] != null) 
      { 
       // we’ve got a token, they must have logged in ... double-check the token 
       string ssoToken = System.Web.HttpContext.Current.Request.QueryString["Token"].ToString(); 
       string userRoles = string.Empty; 
       if (Authenticate.ValidateSSOToken(ssoToken, out userRoles)) 
       { 
        string userName = System.Web.HttpContext.Current.User.Identity.Name; 
        //((BaseApplicationPage)(this.Page)).CurrentSecurity.SetUser(userName, "", userRoles); 
        //RedirectOnSuccess(); 

        // TODO: Not sure what the MVC equivalent would be for commented out code above 
        return RedirectToAction("Index", "Checklist"); 
       } 
       else 
       { 
        //RedirectToForbiddenPage(); 
HttpStatusCodeResult(HttpStatusCode.Forbidden); 
       } 
      } 
      else if (string.IsNullOrEmpty(System.Web.HttpContext.Current.User.Identity.Name)) 
      { 
       // no user data...go ask them to get SSOToken from service 
       Authenticate.isUserAuthenticated(); 
       return null; // Screwed if I don't return anything because of build error, screwed if I do return something because it messes with the redirect 
      } 
      else 
      { 
       return null; 
      } 
     } 

Authentifier extrait de classe à la fin de isUserAuthenticated qui obtient le jeton:

//string RedirectURL = GetBaseVirtualDirectory() + "/SignIn/Index"; 
string RedirectURL = "https://localhost:XXXX1/SignIn/Index"; 
HttpContext.Current.Response.Redirect(authServiceURL + "/Windows/Auth?RedirectURL=" + RedirectURL, true); 
+0

Copie possible de [Pourquoi est-ce que je reçois "Impossible de rediriger après que les en-têtes HTTP ont été envoyés" lorsque j'appelle Response.Redirect()?] (Http://stackoverflow.com/questions/159523/why-do-i- get-can not-redirect-after-http-headers-ont-été-envoyé-quand-je-appelle-res) –

Répondre

0

Le problème est que votre méthode Authenticate.ValidateSSOToken déjà appelé HttpContext.Current.Response.Redirect, qui, comme un message d'erreur confirme, a ajouté un en-tête de redirection (Location) à la réponse.

Vous pourriez être en mesure d'effacer la réponse avant d'appeler RedirectToAction.

Mais une méthode appelée ValidateSSOToke ne devrait probablement pas effectuer elle-même de redirection. Il devrait retourner un statut et vous devriez faire des redirections en dehors de cela en fonction de ce statut.

Et faire toute cette validation dans votre Action n'est probablement pas une bonne pratique pour commencer.

+0

Eh bien, la chose est que ça ne va pas encore à ValidateSSOToken encore. En termes de flux de courant. Site de visites utilisateur -> Puisque l'utilisateur n'a pas de jeton, la méthode passe à else si token -> else si appelle Authenticate.isUserAuthenticaed -> isUserAuthenticated appelle le service d'authentification avec une URL de redirection vers Index -> (le flux est interrompu ici à la fin si retour, [flux qui est censé arriver après suit]) -> application passe en premier si -> en passant par seconde si, appelle à nouveau service pour valider jeton -> cookies utilisateur et al get set -> méthode redirige vers le Liste de contrôle qui est l'interface utilisateur que l'utilisateur veut –

+0

Oh, mon erreur, c'est isUserAuthenticated pas ValidateSSOToken. Mais tout le reste est probablement toujours vrai. isUserAuthenticated ne devrait pas faire la redirection. –