Подтвердить что ты не робот

ASP.NET MVC - Как скрыть или показать ссылку/кнопку на основе зарегистрированного разрешения "Роль пользователя"?

Я использую ASP.NET MVC4.

Это мои userroles

1. Administrator
2. L1 Admin
3. L2 Admin

У пользователей группы администратора есть разрешение для настроек (добавление, настройки разрешений). Просмотр журналов, отчетов об ошибках и т.д.

Если пользователь является членом группы Administrator, он может видеть только меню, которые связаны с настройками выше.

У меня есть таблица меню, имеющая детали меню. Существуют некоторые функции, такие как "Удалить", "Редактировать", которые отображаются в зависимости от роли текущего пользователя и недоступны в верхнем меню. Удалить ссылку "Редактировать" помещается внутри таблицы, в то время как листинг данных. Это также включено и для этих типов ввода IsVisible является ложным.

MenuID - MenuName - Controller - Action - ParentID - IsVisible

У меня есть таблица roleenen, имеющая меню, которое назначается для каждой роли.

RoleID - MenuID

Если Admininstrator входит в систему, он может видеть все меню. Если L1Admin входит в систему, он может видеть только меню, которое ему назначено.

Я создал настраиваемый атрибут для аутентификации, после чего я запрашиваю базу данных и получаю разрешение для пользователя на основе Contoller и Action (в меню Table входит 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>

Спасибо заранее.

ИЗМЕНИТЬ

Я храню данные разрешений в базе данных.

4b9b3361

Ответ 1

Например, вы можете сделать это следующим образом:

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

Ответ 2

Вариант 1. Учитывая, что вы используете членство asp.net.

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

Вариант 2. Укажите роли в userData в случае, если вы создаете AuthCookie самостоятельно, а затем установите HttpContext.Current.User на новый GenericPrinciple (выберите userrole из пользовательских данных authcookie) по методу Application_PostAuthenticateRequest Global.asax.cs file - Оставлять реализацию на вас в Google.

Это должно работать позже

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

Ответ 3

Создайте собственное вспомогательное расширение, подобное этому, где CustomMethodForRetrievingUserFlag() возвращает пользовательские разрешения, CustomMethodForRetrievingFlags возвращает разрешенные разрешения для действия, например. Удачи.

Использование из представления: @Url.CustomUrl( "Главная", "Индекс" )

[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

Из-за хранения сведений о разрешении в базе данных, Вы можете проверить разрешение следующим образом.

Option 1 Создать авторизованное расширение ссылки действий. Демо

Создайте пользовательский html авторизированный 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   Создать статическую функцию и проверить перед ссылкой на действие

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}