Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 4 自定义ChildAuthorization属性以阻止内容,而不是重定向或出错_Asp.net Mvc 4 - Fatal编程技术网

Asp.net mvc 4 自定义ChildAuthorization属性以阻止内容,而不是重定向或出错

Asp.net mvc 4 自定义ChildAuthorization属性以阻止内容,而不是重定向或出错,asp.net-mvc-4,Asp.net Mvc 4,我正在尝试实现一个authorized属性,以便将其应用于某些子操作。目的是,例如,当该人员获得授权并具有访问权限时,显示菜单,否则返回登录页面时不会出现错误或重定向。我尝试了几种不同的退货方式,但没有成功。下面的例子 //SideMenu.cshtml @{Html.RenderAction("AdminMenu", "Menu", "Menu");} @{Html.RenderAction("CommitteeMenu", "Menu", "Menu");} @{

我正在尝试实现一个authorized属性,以便将其应用于某些子操作。目的是,例如,当该人员获得授权并具有访问权限时,显示菜单,否则返回登录页面时不会出现错误或重定向。我尝试了几种不同的退货方式,但没有成功。下面的例子

//SideMenu.cshtml
    @{Html.RenderAction("AdminMenu", "Menu", "Menu");}

    @{Html.RenderAction("CommitteeMenu", "Menu", "Menu");}

    @{Html.RenderAction("MemberMenu", "Menu", "Menu");}

    @{Html.RenderAction("PublicMenu", "Menu", "Menu");}

//MenuController
         [BlockChildContentAuthorize(Roles = " Committee, Admin, Full_rights")]
         [ChildActionOnly]
         public virtual ActionResult CommitteeMenu()
         {
                 ....
         }

//Authorize.cs     
    public class BlockChildContentAuthorizeAttribute : AuthorizeAttribute
        {    

            protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext)
            {
                if (filterContext.IsChildAction)
                {
                    if (filterContext.HttpContext.Request.IsAuthenticated)
                    {

                    }
                    else
                    {
                        filterContext.Result = new System.Web.Mvc.HttpStatusCodeResult(HttpStatusCode.Unauthorized);

                        return;
                    }
                }
            }
    }

您无法直接从自定义属性操纵视图,请尝试类似以下操作:如果用户未经身份验证,请创建一个视图包,并在视图中进行检查

    protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext)
        {
         filterContext.Controller.ViewBag.IsAuthenticated = true;             
         if (filterContext.IsChildAction)
                {
                  if (!filterContext.HttpContext.Request.IsAuthenticated)
                  {
                  //User is not authenticated, Redirect to login page                                              
                  filterContext.Controller.ViewBag.IsAuthenticated = false;
                    }
                 //else user is authenticated, do nothing Action result will be executed.
                }else
               {
                 // not child action, perform operation.
               }         
        }
View-SideMenu.cshtml-未经身份验证的用户无法查看委员会菜单链接(例如)

或者,您可以直接在视图中检查用户身份验证,这样就可以避免使用自定义属性

    //SideMenu.cshtml
    @{Html.RenderAction("AdminMenu", "Menu", "Menu");}
    @if(HttpContext.Current.Request.IsAuthenticated)
    {
      Html.RenderAction("CommitteeMenu", "Menu", "Menu");
    }
    @{Html.RenderAction("MemberMenu", "Menu", "Menu");}
    @{Html.RenderAction("PublicMenu", "Menu", "Menu");}

若用户未经授权,您到底想做什么?@ssilas777已更新以更好地说明其意图。一个例子是一个侧菜单,它应该只显示我允许的选项,所以没有上述角色的人不应该看到委员会的意见内容。i、 e不呈现我无法访问的视图。例如,Hanks,但重定向与我的要求相反。我有4个侧菜单的代码“如果用户没有权限访问其中的2个侧菜单,那么它应该显示另外2个,而不是重定向到登录页面,只是不呈现它无权访问的2个视图。谢谢,但这并不能实现所有目标。它正在检查用户是否已根据列出的角色进行授权和身份验证,如果没有,则应不返回任何内容,不返回任何错误。我可以用剃须刀将每个调用包装起来,但这比我预想的要详细。如果用户未经身份验证,是什么让您认为它返回了错误。若用户未通过身份验证,那个么它只是给查看包赋值。正如前面提到的,在授权请求中你们不能做更多的事情。403号。如果用户未按照filterContext使用空白视图对相关角色进行身份验证或未经授权,我已设法使其返回空白视图的结果。结果=new PartialViewResult(){ViewName=“..\\Shared\\blank”};
    //SideMenu.cshtml
    @{Html.RenderAction("AdminMenu", "Menu", "Menu");}
    @if(HttpContext.Current.Request.IsAuthenticated)
    {
      Html.RenderAction("CommitteeMenu", "Menu", "Menu");
    }
    @{Html.RenderAction("MemberMenu", "Menu", "Menu");}
    @{Html.RenderAction("PublicMenu", "Menu", "Menu");}