2016-02-02 5 views
0

Так что я пытаюсь переработать код, который был для шаблона .NET с кодом для моего MVC приложение и класс Authenticate, который они использовали. Предполагается, что метод индекса SignInController, основанный на коде, который они мне дали, заключается в вызове метода класса Authenticate в else if, который получает токен и перенаправляет обратно к методу Index, после чего у приложения теперь есть токен, он идет в первый if условный и другой метод в вышеупомянутом Authenticate проверяет токен. Поскольку пользователи не начнут с токена, else if всегда будет голубь в первую очередь.«Невозможно перенаправить после отправки заголовков http», но Response.Redirect не работает, если я удаляю RedirectToAction

Чтобы успокоить ошибку «Не все коды пути возвращают значение», я должен добавить оператор возврата в конце предложения else if и пункт else. Однако, если I return null Индекс не перенаправляется, как подтверждено точками останова. Однако, если я делаю return RedirectToAction("Index", "SignIn");, я получаю сообщение об ошибке «Не удается перенаправить после отправки HTTP-заголовков», что, как я подозреваю, связано с тем, что вызов Redirect из класса Authenticate еще не завершен. Однако я не согласен с тем, как исправить ситуацию, поскольку либо возвращаемое значение не позволяет перенаправить веб-приложение обратно в индекс ...

Оригинальный «заглянуть» в стиле .NET-код, который я пытаюсь перерабатывать из приложение коллеги:

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

Моя попытка перепрофилировать его в MVC стиле .NET приложения:

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

Аутентифицировать класс сниппета в конце isUserAuthenticated, который получает маркер:

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

Возможный дубликат [Почему я получаю «Не удается перенаправить после отправки HTTP-заголовков», когда я вызываю Response.Redirect()?] (Http://stackoverflow.com/questions/159523/why-do-i- get-can not-redirect-after-http-headers-had-was-sent-when-i-call-res) –

ответ

0

Проблема заключается в том, что ваш метод Authenticate.ValidateSSOToken уже называется HttpContext.Current.Response.Redirect, который, как сообщение об ошибке подтверждает, добавлен редирект заголовок (Location) в ответ.

Возможно, вы сможете устранить ответ, прежде чем звонить RedirectToAction.

Но метод под названием ValidateSSOToke, вероятно, не должен делать никаких переадресаций. Он должен возвращать статус, и вы должны делать какие-либо переадресации за его пределами на основе этого статуса.

И делать все, что валидация внутри вашего действия, вероятно, не является хорошей практикой для начала.

+0

Ну, дело в том, что даже не добираться до ValidateSSOToken. С точки зрения текущего потока. Сайт пользователя посещает -> Поскольку у пользователя нет токена, метод переходит в else, если для получения токена -> else, если вызовы Authenticate.isUserAuthenticaed -> isUserAuthenticated вызывает службу auth с URL-адресом переадресации обратно в индекс -> (разрывы потока здесь в end, если return, [поток, который должен произойти после этого]) -> приложение проходит через первое, если -> при переходе через второе, если снова вызывает службу проверки валидации token -> users cookie и других get set -> Контрольный список, который является пользовательским интерфейсом, который хочет пользователь –

+0

О, моя ошибка, это isUserAuthenticated not ValidateSSOToken. Но все остальное, вероятно, сохраняется. isUserAuthenticated не должен выполнять перенаправление. –