2012-11-20 53 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