Каков наилучший способ обработки системы с несколькими типами пользователей? - PullRequest
0 голосов
/ 23 ноября 2011

Мне дали задание обновить систему asp до MVC3. Моя главная проблема заключается в том, что в текущей системе есть 2 разных типа пользователей, у каждого пользователя есть своя собственная таблица пользователей, а в текущем asp-сайте каждый пользователь определяется рядом различных переменных, хранящихся в сеансе.

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

Я изначально думал о том, чтобы держать их отдельно в системе; иметь тип класса для каждого пользователя, который содержит отдельные переменные, отраженные от их коллеги asp. При входе в систему я мог бы выдвинуть тип пользователя в userdata в файле cookie auth, а затем создать метод расширения в IPrincipal, чтобы при необходимости возвращать тип пользователя.

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

Было бы лучше создать некоторую форму фасада перед пользовательским репозиторием, которая бы приписывала роль общему пользовательскому объекту, который идентифицировал бы тип пользователя в системе? Затем я могу проверить эту роль и извлечь данные, которые раньше хранились в переменных сеанса, когда это необходимо.

Ответы [ 4 ]

0 голосов
/ 25 ноября 2011

Если бы я создавал это приложение с нуля, я бы различал тип пользователя по роли. Имея это в виду, я создал антикоррупционный класс между User Builder и представителями. Это внедряет / удаляет роль (id 0), чтобы отличить тип пользователя. В будущем клиент надеется объединить таблицы, поэтому это пока кажется наиболее разумным способом продвижения вперед.

0 голосов
/ 23 ноября 2011

Я бы определил интерфейс с методами, общими для обоих пользователей, и чтобы оба типа пользователей реализовали интерфейс. Итак, если у вас есть что-то вроде:

interface IUser { bool CanViewPage1(); }
class UserType1 : IUser { }
class UserType2 : IUser { }

Session["user"] = new UserType1();

Тогда вы можете сделать:

var user = (IUser)Session["user"];

Для обычных операций:

if (user.CanViewPage1())
{ 
   ...
}

и для операций, где вам нужен объект пользователя:

bool CanViewPage2(IUser user)
{
   if(user is UserType1)
   {
       var ut1 = (UserType1)user;
       ...
   } else if (user is UserType2)
   {
       var ut2 = (UserType2)user;
       ...
   }
}

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

0 голосов
/ 23 ноября 2011

Id предлагает использовать WIF с настраиваемым простым сервером STS и использовать утверждения для пользовательских типов. http://msdn.microsoft.com/en-us/library/ee748475.aspx

А для проверки этого материала - используйте пользовательский атрибут или просто - Identity.HasClaim («someclaim name or type»).

Также это стандартизирует ваш подход к аутентификации / авторизации, который может сэкономить через некоторое время =)

0 голосов
/ 23 ноября 2011

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

  1. Реализация поставщика членства asp.net и импорт в него всех пользователей.
  2. Создание двухразличные роли для типов пользователей
  3. Использование поставщика профиля для хранения дополнительных свойств из таблиц типов пользователей.

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

...