Так что я пытаюсь переработать код, который был для шаблона .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);
Возможный дубликат [Почему я получаю «Не удается перенаправить после отправки 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) –