我怎样才能实现安全修整Html.RenderAction?(How can I implement

2019-10-17 10:23发布

我期待创造修剪安全(基本上,如果你没有权限不渲染)Html.RenderAction。

其目的是显示各种控件/页面组件,如果该人没有对行动的RenderAction不会被调用的权限(或至少不会导致再直接到登录页面)。 例如,页面显示所有已登录的用户。 然而,有将是只用于人力资源,业务发展部分,如果你是在人力资源和业务的发展,你会得到两个部分等。

通过所谓的RenderAction每个部分是独立的,因此意味着我可以很容易地包含所有需要的部件的网页,但然后他们如果用户是不允许的只是不显示。 如果我叫上的RenderAction一个动作的人没有权限,然后它会导致他们得到重新定向到登录页面。

我已经看到了类似的链接,但因为任何人都做了类似的行动什么做了什么?

我希望能得到这样的:

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

当微件访问是基于人的当前角色。 我有安全访问可以正常使用。 它主要是创建不uncenssarily运行动作,如果用户没有perission一个的RenderAction

我想保持代码的DRY所以我不想携带大量的视图模型的属性,然后不得不包裹每Html.RenderAction在if语句。 这些组件将出现在不同的地方,所以我希望他们能够即插即用。

Answer 1:

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

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)变化的RenderAction:

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

    helper.RenderAction(actionName);
}


Answer 2:

有多个用户类型和权限或访问从一个用户类型到另一个而变化。

这是我从你的问题了。 基于许可,您需要显示或隐藏的组件。 该组件可以是网格,按钮,文本框,邮件等在页。 或视图呈现不同的基础上登录的用户(他的许可)。

这可以使用HTML助手可以轻松实现。

一个粗略的想法。

你需要存储在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" />

因此,如果用户类型为管理员,那么它将返回TRUE,否则,假,所以不执行的一部分,而不是显示。

在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.

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



Answer 3:

我找到了一套扩展的方法在这里工作最好的: http://vivien-chevallier.com/Articles/create-an-authorized-action-link-extension-for-aspnet-mvc-3

它实际上执行所有的动作你指定所以ActionFilters你不必自己执行它。

唯一的缺点是,它不支持的区域被写入的方式。 我敢肯定,它可以修改也明白的地方。



Answer 4:

我实现了以下内容:

    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如何确定用户可以访问网址?

我没有碰授权做这种方式,如果当前用户没有权限的代码不叫



文章来源: How can I implement a security trimmed Html.RenderAction?