ASP.NET MVC 4 Предоставлять разные привилегии пользователям на разных страницах

Допустим, у меня есть приложение ASP.NET MVC 4. Мне нужно предоставить разные привилегии на разных страницах для одних и тех же пользователей. Например, один и тот же пользователь может быть администратором на одной странице и гостем на другой. MVC по умолчанию предоставляет общесистемные права пользователя. Я откопал некоторую информацию о том, что мне следует использовать настраиваемых поставщиков членства для достижения своей цели, но я еще не уверен в этом. Может кто-нибудь предложить решение?

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


person Andrew    schedule 20.11.2013    source источник
comment
Вы бы просто реализовали логику самостоятельно. Скажем, в действии /foo/bar вы просто логически проверяете, находится ли пользователь в роли, и разрешаете или запрещаете действие, затем в /foo/baz вы снова проверяете и разрешаете или запрещаете. Однако вы должны заметить, что это все усложнит. Рассмотрите возможность использования нескольких ролей вместо одной, что означает разные вещи в разных контроллерах / действиях.   -  person xdumaine    schedule 20.11.2013
comment
Я бы сказал, попробуйте использовать несколько ролей. например вместо администратора рассмотрите возможность использования SectionAdministrator и OtherSectionGuest.   -  person Brad Christie    schedule 20.11.2013
comment
Вы можете поместить AuthorizeAttribute в действия вашего контроллера и предоставить свойству Users пользователям, которые должны иметь доступ к определенному действию.   -  person Yevgeniy.Chernobrivets    schedule 20.11.2013


Ответы (1)


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

Для начала замените в голове слово "Роль" на "Операция".

Вам необходимо создать в своем приложении атомарные мелкозернистые разрешения, такие как:

  • UserPropertiesView
  • UserPropertiesModify
  • CreateUser
  • DeleteUser
  • RolesView
  • RolesModify
  • CreateRole
  • DeleteRole

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

К сожалению, стандартные поставщики членства в ASP.Net и ролей полностью основаны на концепции ролей с гранулометрической структурой. Пока вы знаете, что это операторы, а не роли, у вас все будет хорошо.

Абстракции здесь ваши друзья:

public static class Permissions
{
   public static bool Operation(string op)
   {
      //this class can be a lot better
      // it can be testable, and check
      // error conditions, but this is
      // only an example :)
      return HttpContext.Current.User.IsInRole(op);
   }
}

Где-то вы захотите сгруппировать все эти операции в роли, но это потребует от вас некоторого индивидуального программирования.

Пользовательские поставщики действительно не так страшны, и вы можете легко расширить встроенные.

person Josh    schedule 20.11.2013
comment
Спасибо, Джош. Я действительно думал об этом решении, прежде чем задать вопрос .... Но. Меня специально попросили не реализовывать это решение, потому что оно слишком гибкое. :) Тем не менее, я считаю, что это пока лучшее решение. - person Andrew; 20.11.2013