3

Я уже давно думаю о том, как решить проблему внедрения пользовательской системы на основе идентификатора при использовании ASP.NET MVC. Мои цели, как и система StackOverflow, выглядят следующим образом:Как реализовать пользовательскую систему на основе идентификатора (членство, авторизацию и т. Д.) В ASP.NET MVC?

  • Позволяет пользователям изменять свои прозвища без ограничения «избегать дублирования».
  • Позвольте пользователям пройти аутентификацию через OpenID (а не с паролем на данный момент).

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

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

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

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

ответ

2

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

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

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

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

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

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

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

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

И это работает, как ожидалось:)

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

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

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

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

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

2

Kenji,

Я бы рекомендовал смотреть на некоторые из existing OpenID providers for ASP.NET. Должно быть довольно легко заставить их работать с MVC.

Erick

0

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

0

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