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