"在发送http标头之后无法重定向",但如果我删除RedirectToAction,则Response.Redirect不起作用

时间:2016-02-02 17:26:12

标签: c# asp.net asp.net-mvc redirect forms-authentication

所以我试图回收一些代码背后的代码'我的MVC应用程序和他们使用的Authenticate类的图案化.NET应用程序。 SignInController的Index方法基于他们给我的代码是如何工作的,是调用else if中的Authenticate类方法获取一个令牌并重定向回Index方法,此时该方法app现在有一个令牌,它进入第一个if条件,前面的Authenticate中的另一个方法验证令牌。由于用户不会以令牌开头,因此else if将始终潜入第一位。

为了安抚"并非所有代码路径都返回一个值"错误我必须在else if子句和else子句的末尾添加一个return语句。但是,如果我return null索引没有被断点确认重定向到。但是,如果我执行return RedirectToAction("Index", "SignIn");,我会收到有关&#34的错误;在发送HTTP标头后无法重定向"我怀疑是因为来自Authenticate类的Redirect调用还没有完成。但是,由于返回值无法将Web应用程序重定向回索引,我对如何纠正这种情况感到不满......

原创"看后面"我尝试从同事的应用程序中回收的.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);

1 个答案:

答案 0 :(得分:0)

问题是您的>>> [list(set().union(*[v.tolist() for v in daily_observations.loc[daily_observations.index <= idx].values])) for idx in daily_observations.index] [[1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5]] 方法已调用Authenticate.ValidateSSOToken,在错误消息确认时,会向响应添加重定向标头(HttpContext.Current.Response.Redirect)。

您可以在致电Location之前清除回复。

但是一个名为RedirectToAction的方法可能不应该自己进行任何重定向。它应该返回一个状态,你应该根据该状态在它之外进行任何重定向。

在Action中进行所有验证可能不是一个好习惯。