1

我正在寻找创建一个安全修剪(基本上如果你没有权限不要渲染)Html.RenderAction。

目的是显示各种小部件/页面组件,如果该人没有对该操作的权限,则不会调用 RenderAction(或至少不会导致重定向到登录页面)。例如,该页面显示给所有登录的用户。但是,有些部分仅适用于人力资源、业务发展,如果您从事人力资源和业务发展,您将获得这两个部分等。

RenderAction 调用的每个部分都是独立的,因此这意味着我可以轻松地制作包含所有必需部分的页面,但如果用户不被允许,它们就不会显示。如果我为某人无权执行的操作调用 RenderAction,则会导致他们被重定向到登录页面。

我已经看到对链接做了类似的事情,但是有人对 Actions 做了类似的事情吗?

我希望得到类似的东西:

@Html.RenderSecurityTrimmedAction("Main","Business-Widget1")
@Html.RenderSecurityTrimmedAction("Main","HR-Widget")
@Html.RenderSecurityTrimmedAction("Main","General-Widget3")

其中小部件访问基于人员当前角色。我的安全访问工作完美。它主要是创建一个 RenderAction,如果用户没有权限,它不会随意运行 Action

我想保持代码干燥,所以我不想携带大量 ViewModel 属性,然后不得不将每个 Html.RenderAction 包装在 if 语句中。这些组件会出现在很多地方,所以我希望它们是即插即用的。

4

4 回答 4

3

你可以试试这个扩展方法:

public static void CustomRenderAction(this HtmlHelper helper, string actionName)
{
    if (helper.ViewContext.HttpContext.User.Identity.IsAuthenticated == false)
        return;

    helper.RenderAction(actionName);
}

如果您想为每个操作指定角色,您可以执行以下操作:

1)覆盖 AuthorizeAttribute 如下:

public class MyAuthAttribute: AuthorizeAttribute
{
  public override void OnAuthorization(AuthorizationContext filterContext)
  {
    if (filterContext.HttpContext.Items["DontRedirectToLogin"] != null)
    {
       if (base.AuthorizeCore(filterContext.HttpContext) == false)
       {
          filterContext.Result = new EmptyResult();
          return;
       }

       return;
    }

    base.OnAuthorization(filterContext);
  }
}

2)改变渲染动作:

public static void CustomRenderAction(this HtmlHelper helper, string actionName)
{
    helper.ViewContext.HttpContext.Items["DontRedirectToLogin"] = true

    helper.RenderAction(actionName);
}
于 2012-11-20T10:23:30.697 回答
1

有多种用户类型,权限或访问因一种用户类型而异。

这是我从你的问题中得到的。根据权限,您需要显示或隐藏组件。组件可以是页面中的网格、按钮、文本框、消息等。或者根据登录的用户(他的许可),视图呈现不同的方式。

这可以使用 HTML Helper 轻松实现。

一个粗略的想法。

您需要将数据存储在 xml、数据库等中。即,您需要将登录的用户类型与控制器和操作进行映射。

表/数据权限设置

Admin - UserController- ViewAllUsersAction
Admin-  UserController- DeleteUserAction
Employee - UserController- RequestUserAccessAction
Employee - AlertsController- LatestNewsAction
* - UsersController- ChangePasswordAction

考虑两种用户类型。管理员,员工。管理员有权访问 ViewAllUsers、DeleteUser 等。员工有权访问 ReqUserAccess、LatestNewsAction。

HtmlHelper

public static bool IsAuthorized(this HtmlHelper helper, string Controller, string Action)
{ 
   // This method query the database/storage withe controller,action and usertype.
   // In case of WindowsAuthentication, you can get the userGroup from a LDAP Server/Domain. You must know the logged in user group here, if you are not using win auth.
}

在 EmpList.Cshtml 中

if( @Html.IsAuthorized("UserController","DeleteUserAction"))   <input type="submit" text="Delete Employee" />

所以如果用户类型是Admin,那么它会返回true else,false,这样那部分就不会被执行,也不会显示。

在 Windows 身份验证的情况下,我们需要使用 Windows 用户组而不是上面提到的用户类型。

编辑

if( @Html.IsAuthorized("Main","HR-Widget"))
   @Html.RenderSecurityTrimmedAction("Main","HR-Widget") 
   // this will be rendered only based on the permission for the user.

谢谢,希望这对你有用。:)

于 2012-11-20T10:35:58.780 回答
0

我实现了以下内容:

    public static void SecurityTrimmedRenderAction(this HtmlHelper htmlHelper,
                                                  ActionResult actionResult)
    {
        var routeValueDictionary = actionResult.GetRouteValueDictionary();
        var actionName = (string)routeValueDictionary["Action"];
        var controllerName = (string)routeValueDictionary["Controller"];
        //var areaName = (string)routeValueDictionary["Area"];
        var hasActionPermission = SecurityTrimmingExtensions.HasActionPermission(htmlHelper, actionName,
                                                                                 controllerName);
        if (hasActionPermission)
        {
            htmlHelper.RenderAction(actionResult);
        }
    }

SecurityTrimmingExtensions 遵循此处找到的代码:ASP.Net MVC 如何确定用户是否可以访问 URL?

我不必以这种方式触摸授权,因为如果当前用户没有权限,则不会调用代码

于 2013-01-14T16:18:28.567 回答
0

我发现这里的扩展方法集效果最好:http: //vivien-chevallier.com/Articles/create-an-authorized-action-link-extension-for-aspnet-mvc-3

它实际上对您指定的操作执行所有 ActionFilter,因此您不必自己执行它。

唯一的缺点是它不支持写入方式的区域。我相信它可以被修改以也理解领域。

于 2012-11-20T17:20:00.297 回答