26

ASP.NET MVC4 を使用しています。

これは私のユーザーロールです

1. Administrator
2. L1 Admin
3. L2 Admin

管理者グループのユーザーは、設定の権限を持っています (使用される追加、権限設定)。ログ、エラー レポートなどを表示します。

ユーザーが管理者グループのメンバーである場合、そのユーザーは上記の設定に関連するメニューのみを表示できます。

メニューの詳細を含むメニュー表があります。削除、編集など、現在のユーザーの役割に基づいて表示され、トップ メニューには表示されない機能がいくつかあります。削除、編集リンクは、データの一覧表示中にテーブル内に配置されます。それも含まれており、そのタイプの entry では、IsVisible は false です。

MenuID - MenuName - Controller - Action - ParentID - IsVisible

各ロールに割り当てられたメニューを持つ roleMenu テーブルがあります。

RoleID - MenuID

管理者がログインしている場合、管理者はすべてのメニューを表示できます。L1Admin がログインしている場合、彼は自分に割り当てられたメニューしか見ることができません。

認証用のカスタム属性を作成した後、データベースにクエリを実行し、コントローラーとアクションに基づいてユーザーのアクセス許可を取得します (テーブル Menu は RoleMenu に参加します)。そのため、ユーザーがブラウザに入力して URL を介してアクションにアクセスしようとすると、リクエストを制限できます。

L1Admin として入力すると、リスト ページしか表示されず、メニューが正しく作成されます。私がリストに使用しているリストページで。ログインしたユーザーのアクセス許可に基づいて、編集/詳細リンクを非表示にするにはどうすればよいですか。

 <div style="float: left">
        <table width="50%">
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Name)
                </th>
                <th>
                </th>
            </tr>
            @foreach (var item in Model)
            {
                <tr>
                    <td style="width:30%;">
                        @Html.DisplayFor(modelItem => item.Name)
                    </td>
                    <td style="width:20%;">
// I need to hide EDIT/DELETE based on the permission setting of Current logged in user.
                        @Html.ActionLink("Edit", "Edit", new { id = item.ID }) | 
                        <a href="Server/@item.ID">Details</a> |
                        @Html.ActionLink("Delete", "Delete", new { id = item.ID })
                    </td>
                </tr>
            }
        </table>
    </div>

前もって感謝します。

編集

権限の詳細をデータベースに保存しています。

4

5 に答える 5

46

たとえば、次のような方法で実行できます。

@if (ViewContext.HttpContext.User.IsInRole("Your role"))
{
    // Do something here
}
于 2012-07-26T11:39:35.620 に答える
16

オプション 1 - asp .net メンバーシップを使用していることを考慮してください。

@if (Roles.IsUserInRole("Administrator"))
{ 
  //show link 
}
else
{
  //hide link/button
}

オプション 2 - 独自にAuthCookieを作成し、後で Global.asax.cs ファイルの Application_PostAuthenticateRequest メソッドで HttpContext.Current.User を新しい GenericPrinciple (authcookie のユーザーデータからユーザーロールをフェッチ) に設定する場合に、userData でロールを指定します - 実装をそのままにしますあなたはグーグルに。

これは後で動作するはずです

System.Web.HttpContext.Current.User.IsInRole("RoleName");
于 2012-07-26T11:49:41.953 に答える
5

このようなカスタム ヘルパー エクステンションを作成します。ここで、CustomMethodForRetrivingUserFlag() はユーザー アクセス許可を返し、CustomMethodForRetrivingFlags は、たとえばアクションに対して許可されたアクセス許可を返します。幸運を。

ビューからの使用法: @Url.CustomUrl("Home", "Index")

[Flags]
public enum AuthorizeFlags
{
    Administrator = 1,
    L1 = 2,
    L2 = 4
}

public static class UrlHelperExtensions
{
    public static MvcHtmlString CustomUrl(this UrlHelper urlHelper, string controllerName, string actionName, object routeValues = null)
    {
        var actionFlag = CustomMethodForRetrievingFlags(actionName);
        var userFlag = CustomMethodForRetrievingUserFlag();

        if ((actionFlag & userFlag) == userFlag)
        {
            return new MvcHtmlString(urlHelper.Action(actionName, controllerName, routeValues));
        }

        return new MvcHtmlString(String.Empty);
    }

    private static AuthorizeFlags CustomMethodForRetrievingUserFlag()
    {
        return AuthorizeFlags.L2;
    }

    private static AuthorizeFlags CustomMethodForRetrievingFlags(string actionName)
    {
        return (AuthorizeFlags.Administrator | AuthorizeFlags.L1); // test stub
    }
}
于 2012-07-26T11:42:43.653 に答える