1

トリミングされたセキュリティを作成しようとしています(基本的に、権限がない場合はレンダリングしないでください)Html.RenderAction。

目的は、さまざまなウィジェット/ページコンポーネントを表示することであり、ユーザーがアクションに対する権限を持っていない場合、RenderActionは呼び出されません(または少なくともログインページへのリダイレクトは発生しません)。たとえば、ページはログインしているすべてのユーザーに表示されます。ただし、HR、ビジネス開発専用のパーツがあり、HRとビジネス開発の場合は、両方のパーツなどを入手できます。

RenderActionによって呼び出される各パーツはスタンドアロンであるため、必要なすべてのパーツを含むページを簡単に作成できますが、ユーザーが許可されていない場合、それらは表示されません。誰かが権限を持っていないアクションに対してRenderActionを呼び出すと、ログインページにリダイレクトされます。

リンクで同様のことが行われているのを見たことがありますが、アクションで同様のことを行った人はいますか?

私は次のようなものを手に入れたいと思っていました:

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

ウィジェットへのアクセスは、個人の現在の役割に基づいています。私はセキュリティアクセスが完全に機能しています。これは主に、ユーザーに権限がない場合にアクションを無意識に実行しないRenderActionを作成することです。

コードをDRYのままにしておきたいので、多くの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)RenderActionを変更します:

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ヘルパーを使用して簡単に実装できます。

大まかなアイデア。

データをxml、データベースなどに保存する必要があります。つまり、ログインしたユーザータイプをコントローラーとアクションにマッピングする必要があります。

テーブル/データ権限設定

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

2つのユーザータイプを考えてみましょう。管理者、従業員。管理者は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

ここでの拡張メソッドのセットが最も効果的であることがわかりました:http://vivien-chevallier.com/Articles/create-an-authorized-action-link-extension-for-aspnet-mvc-3

実際には、指定したアクションに対してすべてのActionFilterが実行されるため、自分で実行する必要はありません。

唯一の欠点は、それが書かれている方法で領域をサポートしていないことです。エリアも理解できるように修正できると思います。

于 2012-11-20T17:20:00.297 に答える
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 に答える