【问题标题】:MVC 3 Redirect not workingMVC 3重定向不起作用
【发布时间】:2013-01-26 14:22:22
【问题描述】:

我有一个与动作重定向相关的小问题。我想阻止用户使用我的 BaseController 类中的 OnActionExecuting 的覆盖来访问有关站点中特定区域的信息,该类是我所有控制器的基类。方法体:

protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (Request.IsAuthenticated && (User as Eagle.Security.EaglePrincipal != null) && Session != null && Session["LastKnownGoodArea"] != null && filterContext.ActionDescriptor.ActionName != "InvalidPermission")
        {
            var currentArea = Principal.CurrentCenter.CODEFORM_CSE;
            if (currentArea != Session["LastKnownGoodArea"].ToString())
                RedirectToActionPermanent("InvalidPermission", "Account", new { target = 0, redirectURL = null as string });
            else
                base.OnActionExecuting(filterContext);
        }

    }

但是,这不会重定向到指定的操作。我究竟做错了什么?如果有的话,你们会建议什么其他方法?

谢谢, 西尔维

【问题讨论】:

  • 嗯,这不是一个真正的选择,因为在某些情况下,我只想调用基类(控制器)OnActionExecuting,它的返回类型为 void,而这正是它应该如何工作的。

标签: asp.net-mvc asp.net-mvc-3 redirecttoaction


【解决方案1】:

戴夫的评论是对的!此外,这应该是您正在寻找的语法:-

 protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (Request.IsAuthenticated && (User as Eagle.Security.EaglePrincipal != null) && Session != null && Session["LastKnownGoodArea"] != null && filterContext.ActionDescriptor.ActionName != "InvalidPermission")
            {
                var currentArea = Principal.CurrentCenter.CODEFORM_CSE;
                if (currentArea != Session["LastKnownGoodArea"].ToString())
                {
                filterContext.Result = new RedirectToRouteResult(new
                    RouteValueDictionary(new
                    {
                        controller = "InvalidPermission",
                        action = "Account",
                        target = 0,                                         
                    }));
                filterContext.Result.ExecuteResult(filterContext);
                }       
                else
                {
                    base.OnActionExecuting(filterContext);
                }
            }

        }

【讨论】:

  • 好吧,结合您的建议,以及您真正的点睛之笔,我成功了!
【解决方案2】:

我想阻止用户通过覆盖我的 BaseController 类中的 OnActionExecuting 来访问有关站点中特定区域的信息,该类是我所有控制器的基类。

您为什么选择为此使用 OnActionExecuting?您正在对每个请求执行此 if 语句,我建议对特定操作使用 Authorize 属性:

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var user = User as Eagle.Security.EaglePrincipal;

        if(httpContext.User.Identity.IsAuthenticated && user != null)
        {
            var currentArea = Principal.CurrentCenter.CODEFORM_CSE;
            var lastKnownArea = Session["LastKnownGoodArea"];

            if (lastKnowArea == null)
               return false;

            return currentArea.Equals(lastKnownArea.ToString());
        }

        return base.AuthorizeCore(httpContext);            
    }
}

在您的web.config 中,您可以配置重定向,例如:

 <customErrors mode="RemoteOnly">
  <error statusCode="403" redirect="/InvalidPermission/Account" />
 </customErrors>

如果您想控制 UnAuthorized 请求,您始终可以选择覆盖 HandleUnauthorizedRequest 方法

【讨论】:

  • 嗯,这将是一个很好的解决方案,我给你,但这意味着我必须将新的 attr 添加到我的所有方法中,我真的不喜欢它。但我会保留这个作为未来的参考。谢谢。
  • 好的,如果所有方法都在同一个控制器中,您始终可以将属性分配给控制器。
  • 当前架构的方法分布在多个(读取数十个,可能接近 100 个)控制器上。但!!!它们都继承自 BaseController。让我看看我是否可以在这个类中以某种方式实现你的想法,看看它是否会沿着链条传播。如果是这样,这看起来很精致,我会在这件事上跟随你的领导。将返回测试结果;)
【解决方案3】:

这是最终的解决方案:

var currentArea = Principal.CurrentCenter.CODEFORM_CSE;
            if (currentArea != Session["LastKnownGoodArea"].ToString())
            {
                filterContext.Result = new RedirectToRouteResult(new
                    RouteValueDictionary(new
                    {
                        controller = "Account",
                        action = "InvalidPermission",
                        area = "",
                        target = 0,
                        redirectURL = ""
                    }));
            }
            else
            {
                base.OnActionExecuting(filterContext);
            }

谢谢你们的意见,你们帮了很多忙! 干杯!

【讨论】:

    【解决方案4】:

    您无法从过滤器重定向到操作,因为它尚未创建操作结果。您只能创建一条新路线。我不完全确定您需要的语法。我把这个放在一起作为一个例子。

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (Request.IsAuthenticated && (User as Eagle.Security.EaglePrincipal != null) && Session != null && Session["LastKnownGoodArea"] != null && filterContext.ActionDescriptor.ActionName != "InvalidPermission")
            {
                var currentArea = Principal.CurrentCenter.CODEFORM_CSE;
                if (currentArea != Session["LastKnownGoodArea"].ToString())
                filterContext.Result = new RedirectToRouteResult(
        new System.Web.Routing.RouteValueDictionary {
            {"controller", "InvalidPermission"}, {"action", "Account"}, {target =0}, {redirectURL = null as string }
    
                else
                    base.OnActionExecuting(filterContext);
            }
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      相关资源
      最近更新 更多