Я строю мультитенантный сайт с MVC3.До этого проекта я никогда не касался ни стека .NET, ни веб-разработки в целом, так что, как вы можете себе представить, мне немного не хватает знания предметной области.
Я все еще использую архитектуру AccountController по умолчанию, но я довольнобыстро определил, что я не хочу использовать aspnetdb.mdf для аутентификации, так как его дизайн сильно отличается от моих требований.Я действительно хочу аутентификацию на основе ролей, поэтому я в конечном итоге написал пользовательские классы User и Role в качестве классов Entity, использующих код, и использовал этот учебник для настройки пользовательских MembershipProvider и RoleProvider.
Все работаетна данный момент хорошо, но по мере того, как я создаю функциональность с несколькими арендаторами, становится все сложнее.На основании этого примера я использую пользовательское расширение Controller, которое отслеживает, какой арендатор использует этот сеанс, и все мои контроллеры расширяют этот класс вместо базового класса Controller.
Все арендаторы используют одну базу данных.Каждая сущность имеет свойство Tenant, которое определяет, кому она принадлежит.
Итак, вот проблема:
Имена пользователей не должны быть глобально уникальными.Только комбинация имени пользователя и арендатора должна быть уникальной.Таким образом, ValidateUser должен знать имя пользователя, пароль и владельца .Поскольку мой пользовательский MembershipProvider не является контроллером, он не знает, какой арендатор использует сеанс, а метод ValidateUser принимает только имя пользователя и пароль, поэтому я не могу передать ему эту информацию.
Более того, в значительной степенивсе, что делает MembershipProvider, кроме ValidateUser, уже реализовано в классе UserRepository, что и было сказано в этом руководстве.Мне скорее нравится шаблон Repository, и он гораздо удобнее, чем привязка к интерфейсу MembershipProvider, но теперь существует огромный конфликт интересов между UserRepository и MembershipProvider.
Итак, мой вопрос:
Нужно ли вообще использовать MembershipProvider или даже Membership?
Кажется, что все, что делает MembershipProvider, будет выполняться более удобным для моего класса репозитория.На данный момент все, что мне нужно сделать, это написать новый атрибут Authorize, который не зависит от членства, и все должно работать без членства вообще, верно?Если я не отказываюсь от членства, я вынужден полностью изуродовать мою реализацию MembershipProvider до такой степени, что она все равно почти не похожа на оригинальный интерфейс.
... Либо это, либо членство делает массу вещей, которые яне осознавать и устранять это явная глупость.Это также отличная возможность.