【问题标题】:Redirect to external url from OnActionExecuting?从 OnActionExecuting 重定向到外部 url?
【发布时间】:2015-08-26 07:41:20
【问题描述】:

我需要从 OnActionExecuting 方法重定向到外部 URL(比如说“www.google.com”)。现在我正在使用这样的东西:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    if (!HttpContext.Current.User.Identity.IsAuthenticated)
    {
        var redirectUrl = "www.google.com";

        try
        {
            var isAjaxRequest = filterContext.HttpContext.Request.IsAjaxRequest();

            if (isAjaxRequest)
            {
                filterContext.HttpContext.Response.StatusCode = SessionController.CustomHttpRedirect;
                filterContext.HttpContext.Response.StatusDescription = redirectUrl;

                filterContext.Result = new JsonResult
                {
                    Data = new { Redirect = redirectUrl },
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };
            }
            else
            {
                filterContext.Result = new RedirectResult(redirectUrl, true);

            }

                return;
            }
            else
            {
                throw new LoggedOutException();
            }
        }
        catch
        {
            throw new LoggedOutException();
        }
    }
}

问题是它没有将我重定向到“www.google.com”,而是重定向到“http://localhost:1234/www.google.com”(我在本地尝试)。 有什么办法可以解决这个问题? 谢谢

【问题讨论】:

    标签: asp.net-mvc redirect url-redirection


    【解决方案1】:

    这个问题很容易解决:

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!HttpContext.Current.User.Identity.IsAuthenticated)
        {
            var redirectUrl = "http://www.google.com";
    
            try
            {
                var isAjaxRequest = filterContext.HttpContext.Request.IsAjaxRequest();
    
                if (isAjaxRequest)
                {
                    filterContext.HttpContext.Response.StatusCode = SessionController.CustomHttpRedirect;
                    filterContext.HttpContext.Response.StatusDescription = redirectUrl;
    
                    filterContext.Result = new JsonResult
                    {
                        Data = new { Redirect = redirectUrl },
                        JsonRequestBehavior = JsonRequestBehavior.AllowGet
                    };
                }
                else
                {
                    filterContext.Result = new RedirectResult(redirectUrl, true);
    
                }
    
                    return;
                }
                else
                {
                    throw new LoggedOutException();
                }
            }
            catch
            {
                throw new LoggedOutException();
            }
        }
    }
    

    我所要做的就是当我将值分配给“redirectUrl”时,我让你把 http 放在 wwww 之前。如果您使用 SSL 连接并且您尝试从 mvc 重定向到另一个域,则必须设置此选项。

    【讨论】:

      【解决方案2】:

      而不是使用:

      filterContext.Result = new RedirectResult("www.google.com", true);
      

      尝试以下方法:

      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Home", action = "External" , ReturnURL = "www.google.com"}));
      

      并在您的 (Home) 控制器中创建一个名为 (External) 的操作并从那里重定向到您的外部 url:

       public class HomeController : Controller
              {
      [AllowAnonymous]
               public ActionResult External(string ReturnURL){
                 return Redirect(ReturnURL);
              }
          }
      

      您不能直接从 ajax 响应执行服务器端重定向。但是,您可以返回带有新 url 的 JsonResult 并使用 javascript 执行重定向。看到这个answer

      【讨论】:

      • 我不能使用 filterContext.Result = Redirect("www.google.com");因为我不在控制器中,所以我在继承“ActionFilterAttribute”的类中
      • 即使这样也无法正常工作,因为当我重写 OnActionExecuting() 方法时,我在 if 语句中进行测试以查看用户是否已通过身份验证。通过您向我展示的这些修改,它在该 if 语句中进入无限循环(if (!HttpContext.Current.User.Identity.IsAuthenticated)
      • 你是如何应用 [Authorize] 属性的?
      • 我在“Global.asax.cs”的“RegisterGlobalFilters”方法中添加了这个过滤器
      • 我已经编辑了我的答案。将 [AllowAnonymous] 属性添加到 Controller 上的(外部)操作
      猜你喜欢
      • 2019-10-23
      • 1970-01-01
      • 2017-12-11
      • 2012-01-10
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-03
      相关资源
      最近更新 更多