Каков наилучший способ ограничить услуги для определенных пользователей - PullRequest
2 голосов
/ 14 июня 2011

РЕДАКТИРОВАТЬ: перефразированный и упрощенный вопрос, чтобы быть согласованным ...

В моем слое обслуживания у меня есть что-то вроде

GetAllMessages(string userid); 

В моей системе могут быть пользователи разных типов, такие как клиенты / поставщики и т. Д. *

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

DeleteAllMessages(string userid); //client only
NewSupplierMessages(string userid); //supplier

Обычно эти методы находятся в одном классе с именем MessagesService

ПРИМЕЧАНИЕ: просто чтобы уточнить, пользователь вошел в систему и прошел аутентификацию, однако мне интересно, должен ли я написать свои методы так:

DeleteAllMessages(ClientUser user); //client only
NewSupplierMessages(SupplierUser userid); //supplier

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

РЕДАКТИРОВАТЬ 2:

Обратите внимание, что мой уровень домена находится в отдельной библиотеке классов от моего веб-приложения, «пользователь клиента» будет частью «клиента», аналогично «пользователь поставщика» будет частью «поставщика» - так что, если я хотел запросить мой сервисный уровень и вызвать правильный код (то есть получить правильные данные) - я ДОЛЖЕН передать идентификатор пользователя или строго типизированный класс пользователя, я не могу понять, как иметь ограничение на объект DTO, представляющий, кто может получить доступ услуга как некорректная / хрупкая?

В противном случае у меня будет что-то вроде этого:

GetClientDetails();

Пользователь обрабатывается asp.net, поэтому мы знаем, что пользователь может получить доступ к этому действию, однако что, если есть несколько клиентов? Конечно, тогда мы должны передать некоторые идентификаторы клиента / если бы я должен был передать идентификатор пользователя, я мог бы получить из него идентификатор клиента ...

Скорее я бы сказал, что мой доменный слой неверен, увидев что-то вроде подписи выше ...

РЕДАКТИРОВАТЬ 3: Единственная другая альтернатива, о которой я мог бы подумать, - когда пользователь аутентифицируется, сохраните использование в классе с именем UserSession внутри приложения asp.net mvc как глобальное состояние, а затем внедрите его с помощью DI (ninject) в мой уровень обслуживания домена, поэтому когда мои подписи могут быть

GetClientDetails();

Класс обслуживания домена, реализующий этот интерфейс, может быть:

public class ClientService : IClientWorkerService
{

    private ISession _session;
    private IGenericRepo = _repo;
    public ClientService(IUserSession _session, IGenericRepo _repo)
    {
      this._session = _session;
      this._repo = _repo;
    }

    public ClientDetails GetClientDetails()
    {
      var loggedonuser = _session.GetUser();

      if(!loggedonuser.isClient())
        throw new NoAccessException()

      return _repo.Single<Client>(x=> x.ClientID == loggedonuser.ClientID);
    }

}

1 Ответ

1 голос
/ 14 июня 2011

См. MSDN: авторизация ASP.NET

Авторизация определяет, является ли личность должна быть предоставлена ​​доступ к конкретный ресурс. В ASP.NET есть два способа авторизовать доступ к данный ресурс:

Авторизация файла

Файл авторизация выполняется FileAuthorizationModule. Это проверяет список контроля доступа (ACL) .aspx или файл обработчика .asmx для определения должен ли пользователь иметь доступ к файл. Разрешения ACL проверены для идентификации пользователя Windows (если Проверка подлинности Windows включена) или для идентичности Windows из ASP.NET процесс. Для дополнительной информации, см. Олицетворение ASP.NET.

URL-авторизация

URL авторизация выполняется UrlAuthorizationModule, который отображает пользователи и роли для URL-адресов в ASP.NET Приложения. Этот модуль можно использовать выборочно разрешать или запрещать доступ к произвольные части приложения (обычно каталоги) для конкретных пользователи или роли.

...