web-dev-qa-db-ja.com

ASP.NET MVC-ログインしているユーザーの役割の許可に基づいてリンク/ボタンを非表示または表示する方法

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

これは私のユーザー役割です

1. Administrator
2. L1 Admin
3. L2 Admin

管理者グループのユーザーには、設定に対する権限があります(追加、権限設定を使用)。ログ、エラーレポートなどの表示.

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

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

MenuID - MenuName - Controller - Action - ParentID - IsVisible

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

RoleID - MenuID

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

認証用のカスタム属性を作成し、その後データベースにクエリを実行し、ContollerとAction(テーブルメニューが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>

前もって感謝します。

[〜#〜] edit [〜#〜]

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

22
kbvishnu

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

@if (ViewContext.HttpContext.User.IsInRole("Your role"))
{
    // Do something here
}
42
laszlokiss88

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

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

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

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

System.Web.HttpContext.Current.User.IsInRole("RoleName");
11
RollerCosta

データベースに権限の詳細を保存するため、次の方法で権限を確認できます

Option 1許可されたアクションリンク拡張を作成しますデモ

カスタムhtml Authorized ActionLinkを作成し、以下のように呼び出します

 <ul id="menu">              
    <li><%: Html.ActionLink("Home", "Index", "Home")%></li>
    <li><%: Html.ActionLink("About", "About", "Home")%></li>

    // Next line What you are looking for
    <li><%: Html.ActionLinkAuthorized("The Privilege Zone", "ThePrivilegeZone", "Home", true)%></li>
</ul>

注:セキュリティを強化するには、すべてのリクエストが承認されていることを確認するカスタムアクションフィルターが必要です。

Option 2静的関数を作成し、アクションの前にチェックするlink

public static bool IsUserInRole(string rolenamefrom session)
{
    // Check the user have the privilege then return true/false
}

@if (IsUserInRole("Administrator"))
{ //show link }
else
{//hide link/button}
5
Nikhil K S

このようなカスタムヘルパー拡張を作成します。CustomMethodForRetrievingUserFlag()はユーザー権限を返し、CustomMethodForRetrievingFlagsはアクションの許可された権限を返します。幸運を。

ビューからの使用:@ 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
    }
}
4