Как я могу реализовать систему пользователей на основе идентификатора (членство, авторизация и т. Д.) В ASP.NET MVC? - PullRequest
3 голосов
/ 05 ноября 2010

Я долго думал о том, как решить проблему реализации пользовательской системы на основе ID при использовании ASP.NET MVC. Мои цели, как и система StackOverflow, таковы:

  • Разрешить пользователям изменять свои псевдонимы без ограничения "избегать дублирования".
  • Разрешить пользователям проходить аутентификацию через OpenID (пока без пароля).

Я хотел избежать как можно больше переделок, поэтому сначала подумал об использовании провайдеров членства, роли и (возможно) профиля, но я обнаружил, что они основаны на имени пользователя. Я думал об адской адаптации SqlMembershipProvider, используя поле имени пользователя для хранения идентификаторов и выбрасывая исключение UnsupportedException для методов, основанных на пароле и т. П., Чтобы иметь возможность использовать другие системы. Но это кажется громоздким и грязным (если это вообще возможно).

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

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

Чем больше деталей, тем лучше!

Ответы [ 4 ]

2 голосов
/ 05 ноября 2010

Мне нужно было настроить систему быстрого членства для клиента, у них были некоторые требования, которые не позволяли мне использовать встроенную систему сразу же, ни время, чтобы построить то, что они хотели. У меня есть планы в конечном итоге развернуть полную систему управления членством, но, как и вы, мне что-то было нужно сейчас. Я пошел по следующему плану, который, в конечном итоге, позволит мне заменить встроенных провайдеров на свои собственные - временные ограничения и сроки отстой:

У меня есть своя личная таблица пользователей (PT) - MembershipId, UserName, Email, лишняя информация профиля. Это то, что приложение использует для любой пользовательской информации. Это класс, его можно кэшировать, сохранять в контексте http, cookie - однако вы хотите обрабатывать информацию о пользователе.

Затем я настроил SqlProfileProvider для аутентификации, авторизации и ролей. Я не использую провайдера профилей (даже для тривиальных настроек), потому что это боль в MVC. Я не внес никаких изменений во встроенные провайдеры. Это то, что я использую для аутентификации и авторизации.

При создании пользователя мой код выполняет следующие действия:

  1. Проверьте PT на имя пользователя и адрес электронной почты, согласно моим правилам
  2. Создать Guid - MembershipId
  3. Создать MembershipUser, MembershipId - это имя пользователя (адрес электронной почты не имеет значения и не используется), а также пароль пользователя, вопрос и ответ и т. Д.
  4. Создайте пользователя в PT со значениями профиля и используйте MembershipId в качестве PrimaryKey.

При входе в систему я получаю идентификатор членства от PT, проверяю соответствие членству с помощью идентификатора членства и пароля, и все готово.

При удалении пользователя я делаю следующее:

  1. Проверьте PT для пользователя, убедитесь, что я могу / должен удалить
  2. Получить MemberShipId
  3. Использовать транзакцию
  4. Удалить из PT
  5. User Membership.DeleteUser (MembershipId, true) - это гарантирует, что пользователь будет удален из членства и других таблиц aspnet_
  6. * совершить 1037 *

И все работает как положено:)

Несколько вещей: User.Identity.Name будет идентификатором членства (Guid). Это используется для входа в систему и управления ролями. Мой PT - это то место, где хранится информация пользователя (сохранить пароль). Я могу изменять имена пользователей, адреса электронной почты и т. Д., Не влияя на членство или роли, потому что членство основано на PrimaryKey от PT.

Для входа в систему требуется дополнительное попадание в БД, потому что вам нужно запросить PT, чтобы получить для проверки членский идентификатор (можно кэшировать).

Встроенная система аутентификации действительно тяжелая - если вы посмотрите на sprocs, вы увидите все циклы, через которые проходит проверка пользователя. Я бы порекомендовал в конце концов уйти от этого. Но в трудном положении это хорошо работает - и если у вас нет миллионов пользователей, я не думаю, что это будет проблемой.

Я не рассматривал OpenId, и я не уверен, как бы вы его интегрировали, хотя я думаю, что вы, вероятно, могли бы сделать то же самое, что и выше, и вместо того, чтобы проверять действительные учетные данные (после того, как они вернутся проверенной формы OpenId) просто войдите в систему с помощью MembershipId (не проверять членство).

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

2 голосов
/ 05 ноября 2010

Kenji

Я бы рекомендовал взглянуть на существующих поставщиков OpenID для ASP.NET . Должно быть довольно легко заставить их работать с MVC.

Erick

0 голосов
/ 05 ноября 2010

Просто используйте поставщика членства sql и добавьте сохраненный процесс для изменения имени пользователя на уровне базы данных.

0 голосов
/ 05 ноября 2010

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

...