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