簡體   English   中英

如何實現安全修剪的Html.RenderAction?

[英]How can I implement a security trimmed Html.RenderAction?

我正在尋找創建一個安全修剪(基本上如果你沒有權限不渲染)Html.RenderAction。

目的是顯示各種小部件/頁面組件,如果此人沒有對該操作的權限,則不會調用RenderAction(或者至少不會導致重定向到登錄頁面)。 例如,該頁面將顯示給所有登錄用戶。 但是,有些部分僅適用於人力資源,業務開發,如果您從事人力資源和業務開發,您將獲得兩個部分等。

RenderAction調用的每個部分都是獨立的,這意味着我可以輕松地創建包含所有必需部分的頁面,但是如果不允許用戶則不會顯示它們。 如果我為某個動作調用RenderAction而某人沒有權限,則會導致他們重新定向到登錄頁面。

我已經看到類似的鏈接,但任何人做過類似的動作?

我希望得到類似的東西:

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

Widget訪問權限基於人員當前角色。 我的安全訪問工作完美。 它主要是創建一個RenderAction,如果用戶沒有perission,它不會不經常運行Action

我想保留代碼DRY,所以我不想攜帶大量的ViewModel屬性,然后必須在if語句中包裝每個Html.RenderAction。 這些組件將出現在各種各樣的地方,所以我希望它們即插即用。

您可以嘗試這種擴展方法:

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);
}

有多種用戶類型和權限或訪問權限因用戶類型而異。

這就是我從你的問題中得到的。 根據權限,您需要顯示或隱藏組件。 組件可以是頁面中的網格,按鈕,文本框,消息等。 或者根據登錄用戶(他的權限)以不同方式呈現視圖。

這可以使用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用戶組而不是上面提到的usertype。

編輯

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

謝謝,希望這對你有用。 :)

我發現這里的擴展方法效果最好: http//vivien-chevallier.com/Articles/create-an-authorized-action-link-extension-for-aspnet-mvc-3

它實際上會對您指定的操作執行所有ActionFilters,因此您不必自己執行它。

唯一的缺點是它不像寫入方式那樣支持區域。 我相信它可以被修改以理解區域。

我實現了以下內容:

    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?

我不必觸摸授權這樣做,因為如果當前用戶沒有權限,則不會調用代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM