Показать ссылки только с доступом - PullRequest
1 голос
/ 16 марта 2012

Можно ли как-то отображать только ссылки с доступом, который определяется как

[Authorize(Roles = "SomeRole")]

В контроллере?

Ответы [ 3 ]

4 голосов
/ 16 марта 2012

Я не верю, что существует простое решение, позволяющее сделать это без отражения Controller, получения Action и проверки AuthorizationFilters.

С учетом сказанного, альтернативное решение можетсоздать перегрузку метода расширения для Html.ActionLink, которая принимает имя роли и проверяет User.IsInRole(roleName).Выводить ссылку можно только в том случае, если у пользователя есть доступ к указанной роли.

Примерно так:

public static class EntentionMethods
{
    public static MvcHtmlString ActionLink(this HtmlHelper helper, string linkText, string actionName, string controllerName, string roleName)
    {
        if (!helper.ViewContext.RequestContext.HttpContext.User.IsInRole(roleName))
        {
            return MvcHtmlString.Empty;
        }

        return helper.ActionLink(linkText, actionName, controllerName);
    }
}

Не очень красиво, как вы могли надеяться, но это часто служит нуждам

1 голос
/ 10 марта 2015

Одна возможность - использовать MvcSiteMapProvider для вашего меню. Он имеет встроенную функцию усечения безопасности , которая автоматически скрывает ссылки в соответствии с AuthorizeAttribute. Если вам не нравятся встроенные помощники HTML, вы можете настроить шаблоны и / или создать свои собственные помощники HTML, которые скрывают ссылки на основе доступности узла.

Или, если вы не хотите использовать стороннюю библиотеку, вы можете выполнить обратный инжиниринг AuthorizeAttributeAclModule , чтобы создать собственную реализацию.

Полное раскрытие

Я основной участник MvcSiteMapProvider.

1 голос
/ 16 марта 2012

Атрибут Authorize должен быть помещен в действия контроллера (или самого контроллера), к которым вы хотите ограничить доступ, таким образом, вы обязываете только пользователей с ролью «somerole» для доступа к ссылкам, созданным надействия контроллера.Ссылки, доступ к которым вы хотите ограничить, не будут отображаться в атрибуте Authorize.Он просто ограничивает и предписывает пользователям ролей или пользователям с определенными именами доступ к действиям, если роли и пользователи явно определены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...