2012-11-20 118 views
1

我期待創建一個安全修剪(基本上,如果你沒有權限不呈現)Html.RenderAction。如何實現安全修剪的Html.RenderAction?

目標是顯示各種小部件/頁面組件,並且如果該人沒有對RenderAction沒有調用的操作權限(或者至少不會導致重定向到登錄頁面)。例如,該頁面顯示給所有登錄用戶。然而,只有人力資源,業務發展的部分,如果你在人力資源和業務發展,你會得到兩個部分等。

RenderAction調用的每個部分是獨立的,所以這意味着我可以輕鬆地製作頁面包含所有必需部件,但如果用戶不被允許,則不顯示。如果我將RenderAction稱爲某人沒有權限的操作,則會導致他們被重定向到登錄頁面。

我已經看到類似的鏈接,但任何人都做了類似的行爲?

我希望能得到這樣的:

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

當微件訪問是基於人的當前角色。我有安全訪問完美工作。它主要是創建一個RenderAction,如果用戶沒有任何操作,它不會一直運行Action

我想保留代碼DRY,所以我不想攜帶很多ViewModel屬性,然後不得不自動換行if語句中的每個Html.RenderAction。這些組件會出現在各種地方,所以我希望它們能夠即插即用。

回答

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 how to determine if a user can access a URL?

我沒有碰授權做這種方式的代碼是不是如果被叫當前用戶沒有權限

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)更改RenderAction:

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

    helper.RenderAction(actionName); 
} 
+0

對不起。我的意思是說他們可以被授權不具備適當的角色。應該已經被清除器 – GraemeMiller

+0

然後擴展if()與另一個條件:helper.ViewContext.HttpContext.User.IsInRole(「barbarian」) – Dima

+0

然後我必須在助手中定義角色。這些角色正在修改授權操作中的控制器操作,所以我不想再配置它們。只是意味着在兩個地方維護它們,所以不是乾的。謝謝 – GraemeMiller

1

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

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

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

編輯

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

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

+0

想知道如何檢測IsAuthorized中的Action調用是否成功返回,我需要查看響應代碼嗎? – GraemeMiller

+0

@GraemeMiller我們需要檢查特定的組或角色是否被允許執行該操作。它可以存儲在數據庫,XML等。如果允許,那麼動作按鈕是可見的,否則它不會。同樣,他可以隱藏div,部分視圖,渲染操作等。我自己實現了這一個 – kbvishnu

+0

我將用誰有權訪問它來裝飾我的控制器動作。這是我的問題。我可以輕鬆地在代碼中測試並複製我的權限代碼。我的問題是,我想根據他們是否可以訪問操作方法的決定,以便代碼僅依賴於操作的安全性要求 – GraemeMiller