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

Вопрос:Я использую ASP.NET MVC4. Это мои userroles 1. Administrator 2. L1 Admin 3. L2 Admin У пользователей группы администратора есть разрешение для настроек (добавление, настройки разрешений). Просмотр журналов, отчетов об ошибках и т.д. Если пользователь является членом группы Administrator, он может видеть только меню, которые связаны с настройками выше. У меня есть таблица меню, имеющая

Вопрос:

Я использую 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>

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

ИЗМЕНИТЬ

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

Ответ №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}

Оцените статью
Добавить комментарий