.net MVC 4 Авторизация (членство)

На первых шагах в .NET MVC 4 я создаю веб-сайт и хочу реализовать аутентификацию / авторизацию пользователей.

В моей реализации я хотел бы иметь возможность связывать элементы управления с ролями. Например, если у меня есть 2 роли в моей системе: администратор и пользователь, в некотором представлении говорится, что у меня есть 3 входа:

            <input class="search-field rounded" id="field1" type="text"/>
            <input type="submit" name="submit"/>

            <input class="search-field rounded" id="field2" type="text"/>
            <input type="submit" name="submit"/>

            <input class="search-field rounded" id="field3" type="text"/>
            <input type="submit" name="submit"/>

Я бы хотел, чтобы администратор мог видеть и редактировать все 3 поля в этом представлении, но пользователь должен видеть только 2 из них и иметь возможность редактировать одно из них (это всего лишь пример).

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

Это мои ограничения, и я вижу довольно много пакетов (например, Fluent Security и Security Guard), который касается к предмету, но я не совсем уверен, что лучше всего решит мою задачу, если вообще.

Есть ли лучший способ преодолеть этот спрос?

Любая помощь высоко ценится.


person forhas    schedule 15.02.2013    source источник


Ответы (3)


idlehands23 показал, как вы можете получать доступ и проверять роли, но я предполагаю, что вы хотите использовать эту функцию на уровне представления.

В методе действия я обычно передаю HttpContext.User в ViewBag или, в случае строго типизированного представления, вы можете передать принципала в свою модель и проанализировать эти значения по своему усмотрению. Затем передайте модель в представление вот так.

return View(new ModelClass(HttpContext.User))

Отсюда вы можете добавить дополнительный код в логику представления для анализа / проверки ролей и визуализации html с большей специфичностью, например, используя:

If (Model.User.IsInRole("Admin"))
{
    //Render admin controls
    //...
}
else
{
   //Render User Controls
   //...
}

Использование атрибута [Authorize(Role="Admin||User")] в вашем методе действия ограничит доступ для всей группы пользователей. В таком случае вам понадобятся два метода действий и одно или, возможно, два разных представления для визуализации контента. Однако, если вы просто хотите ограничить его ЛЮБЫМ авторизованным пользователем, вы можете сделать так:

    [Authorize]
    public ActionResult Index(){}

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

person NickSuperb    schedule 15.02.2013
comment
Итак, вы предлагаете мне передать текущую роль обратно представлению, тогда представление может решить, как соответствующим образом отобразить страницу. Звучит интересно, я мог бы просто попробовать и сообщить, сработает ли это для меня. - person forhas; 17.02.2013

Я сделал это так:

//In Controller
ViewBag.Roles = Roles.GetRolesForUser(User.Identity.Name);//viewbag because I'm assuming this isn't what you want to strongly type to your page.

//In View
@{
  var roles = (Roles)ViewBag.Roles;
} 
if(roles.contains("admin')) //put whatever you want in place of "admin"
{
    //do something
}

в вашем контроллере вы можете предоставить доступ к определенным представлениям или частичным представлениям таким образом // в контроллере, если хотите.
[Authorize (Roles = "Admin, ImportExport, Search")] // это только для безопасности public ActionResult something () {} * Я использую бритву. замените @ на ‹%%>, если это не так.

person idlehands23    schedule 15.02.2013
comment
Спасибо за ответ, но я не уверен, что понимаю вас. Не могли бы вы уточнить последовательность действий, в которой используется опубликованный вами код? - person forhas; 17.02.2013

В итоге я создал своего собственного поставщика членства и поставщика ролей.

В моем провайдере ролей я добавил метод

public bool UserHasPermission(string username, string permission) {...}

И, на мой взгляд, делаю:

@{
    var roleProvider = Roles.Provider as MyCustomRoleProvider;
    bool addressEditPermission = roleProvider.UserHasPermission(User.Identity.Name, "addressEditPermission");
}

Тогда я могу управлять своим контролем:

@Html.TextBoxFor(model => model.Name, new { @readonly = addressEditPermission })

Вам просто нужно убедиться, что в вашем элементе управления есть перегрузки, принимающие атрибуты HTML.

Я надеюсь, что это помогает кому-то..

person forhas    schedule 20.02.2013