2017-08-27 115 views
1

我想创建过滤器,过滤器应该检查角色(而不是asp.net成员身份或身份但我自己一个),我的愿望是限制所有控制器操作(让我们打电话它是来自低角色级用户的“AuthController”)。MVC过滤器动作重定向到无限循环

在我的过滤条件中,我将限制用户移到主页。

当我在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); 
     } 

    } 
+0

你的问题代码与你的问题有什么关系?你甚至没有显示你的过滤器 –

+0

我写了过滤器所做的事(条件:高角色继续,低角色转到主页),问题是我的操作返回部分视图,这是我不想限制。 – Velahs

+1

再次,什么过滤器?你需要在你的问题中显示相关的代码。 –

回答

1

在过滤器让unauthrized用户是指热首页一些控制器动作,并在局部视图集重定向语句,将出现在作为部分他限制的页面。

控制器:

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> 

现在用户重定向到主页并不会看到主页的局部视图。

0

为什么不让阿贾克斯查询?

添加到您的条件:

!filterContext.HttpContext.Request.IsAjaxRequest() 
+1

这不是安全问题吗? – Velahs

+1

@Velahs你对,查看我的新答案 – shdr