Отображение / скрытие ссылок в ASP.Net MVC View - PullRequest
7 голосов
/ 07 декабря 2009

Я пытаюсь выяснить, как показать / скрыть ссылки для пользователей в зависимости от их ролей. Я знаю, как установить атрибут authorize для метода действия, но у меня возникают проблемы при создании ссылок show hide в представлении, скажем, пользователя, администратора или менеджера в моей базе данных ролей.

Какие-нибудь хорошие статьи или примеры кода, на которые кто-то может указать мне?

Ответы [ 4 ]

11 голосов
/ 07 декабря 2009

По вашему мнению, вы можете ссылаться на пользователя IPrincipal через свойство System.Web.Mvc.ViewPage 's User.

например. По вашему мнению вы можете иметь что-то вроде:

<% if (User.IsInRole("Admin")) { %>
    <%= Html.ActionLink("Admin only link", "Edit", "Users") %>
<% } %>

<% if (User.IsInRole("Manager") || User.IsInRole("Admin")) { %>
    <%= Html.ActionLink("Manager & Admin only link", "Edit", "Product") %>
<% } %>

HTHS
Charles

2 голосов
/ 02 сентября 2010

Это одна вещь, которая мне действительно не нравится в MVC (как в ASP.Net MVC, а не в шаблоне), есть тенденция к перемещению логики пользовательского интерфейса в разметку.

Нет способа запустить модульные тесты для этой логики, если она находится в aspx.

Лично я думаю, что веб-формы с подходящим шаблоном пользовательского интерфейса (MVC или MVP и т. Д.) Лучше подойдут, чем страница, изобилующая условной логикой, которую нельзя проверить.

1 голос
/ 16 сентября 2011
<% if(HttpContext.Current.User.IsInRole("Admin")){%> <a href="/Admin">Admin</a> <% } %>

Используйте этот код. Это проще.

0 голосов
/ 10 июня 2013

Я использую статический класс для проверки роли, и в cshtml, который я использовал, этот класс проверки роли отсутствует в cshtml.

У меня есть авторизованные функции или содержимое в базе данных (по пользователю или роли), поэтому вам не нужно повторно развертывать их, если изменилось определение доступа.

public static class AuthorizeContent
{
    public static bool AuthorizeAccessContent(string Content)
    {
        bool bReturn = false;
        DBContext db = new DBContext();
        string[] RolesUser = Roles.GetRolesForUser(WebSecurity.CurrentUserName);

        foreach (AuthorizedContentRole aut in db.AuthorizedContentRole)
        { 
            foreach (string rol in RolesUser)
            {
                if (aut.Role==rol && aut.Content==Content)
                {
                    bReturn = true;
                    break;
                }
            }
        }
        foreach (AuthorizedContentUser aut in db.AuthorizedContentUser)
        {
            if (aut.UserName == WebSecurity.CurrentUserName && aut.Content == Content)
            {
                bReturn = true;
                break;
            }
        }

        return bReturn; 
    }

/// в cshtml

@if (AuthorizeContent.AuthorizeAccessContent(Content))
{

    <li class="two">
        <h5>Administrator link</h5>
        @Html.ActionLink("Admin secret info","Index", "Information")
    </li>
}

Вы также можете использовать фильтр, например [AccionAuthorize (Action = "MyContent")]

public class AccionAuthorizeAttribute : AuthorizeAttribute
{
    public string Action { get; set; }
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
            filterContext.Result = new HttpUnauthorizedResult();
        else if (!AutorizacionContenido.AutorizaAccesoContenido(Action))
            filterContext.Result = new HttpUnauthorizedResult();
        base.OnAuthorization(filterContext);
    }
}
...