Asp.net MVC3:真的基于角色@ Html.Action()

时间:2013-11-30 17:12:47

标签: c# asp.net asp.net-mvc asp.net-mvc-3 razor

我的视图使用@Html.Action(…)来反映各种功能块。在打开页面时,该站点显示“控制器方法”中没有角色的用户的“授权”对话框。 (例如“经理”或“来电者”)按“取消”获取: 401 - 未经授权:由于凭据无效,访问被拒绝。 如果用户没有必需的角色,@ Html.Action会被忽略或者没有显示任何内容,我是否可以更改我的应用程序行为?

我的观点:

@model InApp.ViewModel.ListViewModel
@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<div id="CallList">
@Html.Action("List","Call",new {id=Model.id})
</div>

<div class="Order">
@Html.Action("Create","Order",new {id=Model.id})
</div>

控制器:

[Authorize(Roles = "manager, caller")] //if a user is not 'manager' or 'caller'
public PartialViewResult List()        // nothing is shown
{
  //...private 
  return PartialView();
}

[Authorize(Roles = "manager, admin")]
public PartialViewResultCreate()
{
  //...private 
  return PartialView();
}

试图找到正确的解决方案我发现了类似的问题:

Ignore @Html.Action() if user not in Roleasp.net MVC3 razor: display actionlink based on user role 但我不喜欢“视图”中的“if”条件。我正在寻找一个复杂的解决方案,只使用AuthorizeAttribute隐藏和显示单独的部分,并避免if - else在View或Controller中。谢谢你的帮助!

2 个答案:

答案 0 :(得分:4)

我可以建议使用这种扩展方法:

这是@ Html.Action的包装器,它使用反射来检查用户权限。

public static  MvcHtmlString ActionBaseRole(this HtmlHelper value, string actionName, string controllerName, object routeValues , IPrincipal user)
 {     
   bool userHasRequeredRole = false;
   Type t = Type.GetType((string.Format("MyProject.Controllers.{0}Controller",controllerName))); // MyProject.Controllers... replace on you namespace
   MethodInfo method = t.GetMethod(actionName);
   var attr = (method.GetCustomAttribute(typeof(AuthorizeAttribute), true) as AuthorizeAttribute);
   if (attr != null)
   {
      string[] methodRequeredRoles = attr.Roles.Split(',');
      userHasRequeredRole = methodRequeredRoles.Any(r => user.IsInRole(r.Trim())); // user roles check in depends on implementation authorization in you site  
                                                                                            // In a simple version that might look like                                                                         
   }
   else userHasRequeredRole = true; //method don't have Authorize Attribute
   return userHasRequeredRole ? value.Action(actionName, controllerName, routeValues) : MvcHtmlString.Empty; 
 }

在视图中使用:

@Html.ActionBaseRole("List","Call",new {id=Model.id},User)

答案 1 :(得分:0)

如果你不喜欢视图中的这个逻辑 - 将它移动到其他地方。例如,您可以制作自己的扩展方法,并将其用作@Html.ActionOrNothing(...)

实现应检查用户是否允许查看内容并返回空字符串/视图。