Подходы к упаковке доступа к функционалу в .NET MVC? - PullRequest
2 голосов
/ 13 марта 2010

Какие существуют различные решения для доступа к функциям в приложении .NET MVC?

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

Мне нужен центральный способ сказать:

  1. Создайте словарь того, что может делать пользователь
  2. Оберните вкладки, кнопки, ссылки и т. Д., Чтобы убедиться, что пользователь может получить доступ к этой функции и показать / скрыть соответствующим образом.

Я знаю, что могу ограничить доступ к действиям через фильтры действий и роли, но как насчет пользовательского интерфейса?

Любая помощь будет оценена. Я уверен, что я не единственный, кто должен был сделать это, спасибо!

1 Ответ

2 голосов
/ 13 марта 2010

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

Но вот что я сделаю:

Создайте AuthorizationService для централизованного хранения этой бизнес-логики. У него будут такие методы, как:

public bool CanEditSomeObject(Guid userId, Guid objectId)

Используйте этот AuthorizationService внутри вашего контроллера (или другой службы, на которую ссылается контроллер), чтобы создать ViewModel со всей информацией авторизации, которая понадобится представлению.

    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult Edit(Guid id)
    {
        bool currentUser = _userService.GetUser(User.Identity.Name);
        bool canEditSomeObject = _authenticationService.CanEditSomeObject(currentUser.Id, id);
        var viewModel = new SomeObjectViewModel {CanEditSomeObject = canEditSomeObject};
        return View(viewModel);
    }

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

<%= if (Model.UserCanEdit) Html.RenderPartial("EditForm.ascx") %>

Кроме того, если вам нужно динамически изменять что-либо на стороне клиента (например, пользователь выполняет действие a, поэтому теперь он может выполнять действие b), вы можете использовать JQuery для манипулирования HTML. Вы даже можете использовать JQuery для вызова контроллера, чтобы задать ему вопросы, если хотите (см. Этот вопрос ), но я не уверен, что это необходимо.

...