【问题标题】:MVC filter action redirect to infinite loopMVC 过滤器动作重定向到无限循环
【发布时间】:2018-02-04 18:07:48
【问题描述】:

我正在尝试创建过滤器,该过滤器应该检查角色(不是 asp .NET 成员资格或身份,而是我自己的一个),我希望限制所有控制器操作(下面将其称为“AuthController” ) 来自低角色级别的用户。

在我的过滤条件中,我删除了限制用户访问主页。

当我在 AuthController 中删除 Ajax 中的高级角色时会出现问题然后我的部分视图将我带到主页。

有没有优雅的方法来避免这种情况?

    [HttpPost, ActionName("DeleteRole")]
    [ValidateAntiForgeryToken]
    public ActionResult DeleteConfirmed(Guid UserId, Guid RoleId)
    {
        CustomProvider CP = new CustomProvider();
        CP.DeleteRoleFromUser(UserId, RoleId);

        return PartialView("RolesDelete", db.Role.Where(p => p.Id == RoleId).SingleOrDefault());

    }

过滤器:

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);

        if (filterContext.HttpContext.User.Identity.IsAuthenticated && string.IsNullOrEmpty(NameFromExternal))
        {
            NameFromExternal = filterContext.HttpContext.User.Identity.Name;
        }
        CustomProvider cp = new CustomProvider();
        if (CustomRoleProvider.Instance.IsUserInRole(cp.getADNameFromFullDomainName(NameFromExternal), eRoles.High.ToString()))
        {
            filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "Auth" }, { "action", "Index" } });
            filterContext.Result.ExecuteResult(filterContext.Controller.ControllerContext);
        }
        else
        {
            filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "Home" }, { "action", "Index" } });
            filterContext.Result.ExecuteResult(filterContext.Controller.ControllerContext);
        }

    }

【问题讨论】:

  • 您显示的代码与您的问题有什么关系?你甚至没有显示你的过滤器
  • 我写了过滤器的作用(条件:高角色继续,低角色进入主页),问题是我的操作返回部分视图,这是我不想限制的。跨度>
  • 再一次,什么过滤器?您需要在问题中显示相关代码。
  • 编辑我的问题

标签: asp.net-mvc url asp.net-mvc-ajax asp.net-mvc-filters


【解决方案1】:

在过滤器处,让未经授权的用户执行一些引用热到主页的控制器操作,并在部分视图中设置重定向语句,该语句将作为他限制的部分页面出现。

控制器:

public ActionResult Redirection(string controller, string view)
    {
        ViewBag.TargetCtrl = "Home";
        ViewBag.TargetView = "Index";
        ViewBag.TargetTitle = "Home Page";
        return PartialView("~/Views/Shared/Redirection.cshtml");
    }

查看

You ara redirected to @ViewBag.TargetTitle
<script>
    window.location.href = '@Url.Action(ViewBag.TargetView, ViewBag.TargetCtrl)';
</script>

现在用户将重定向到主页,并且不会将主页视为部分视图。

【讨论】:

    【解决方案2】:

    为什么不允许 Ajax 查询?

    将此添加到您的条件中:

    !filterContext.HttpContext.Request.IsAjaxRequest()
    

    【讨论】:

    • 不是安全问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 2019-04-03
    • 2015-08-02
    • 1970-01-01
    相关资源
    最近更新 更多