Мне нужно было установить быструю систему членства для клиента, у них были некоторые требования, которые не позволяли мне использовать встроенный сразу с места в пути, а также время, чтобы построить то, что они хотели. У меня есть планы в конечном итоге внедрить полную систему управления членством, но, как и вы, мне сейчас нужно кое-что. Я пошел со следующим планом, который, в конечном счете, позволит мне поменять местами встроенные провайдеры на мои собственные временные ограничения и сроки сосать:
У меня есть своя персональная таблица пользователей (PT) - MembershipId, UserName , Электронная почта, информация о суперфлоре. Это то, что приложение использует для любой пользовательской информации. Это класс, он может быть кэширован, сохранен в контексте http, cookie - однако вы хотите обрабатывать информацию о пользователе.
Затем я настроил SqlProfileProvider для аутентификации, авторизации и ролей. Я не использую поставщика профилей (даже для тривиальных настроек), потому что это боль в MVC. Я не внес никаких изменений в встроенные провайдеры. Это то, что я использую для аутентификации и авторизации.
При создании пользователя, мой код делает следующее:
- Check PT для имени пользователя и адрес электронной почты, на моих правилах
- Создать Guid - MembershipId
- Создать MembershipUser, то MembershipId это имя пользователя (адрес электронной почты не имеет значения и не используется), а также пароль пользователя, вопрос и ответ и т. д.
- Создайте пользователя в PT со значениями профиля и используйте MembershipId как PrimaryKey.
При входе в систему, я получаю MembershipId от PT, проверки против членства с MembershipId и пароль, и я сделал ..
При удалении пользователя, я делаю следующее:
- Check PT для пользователя, убедитесь, что я могу/должен удалить
- Получить MemberShipId
- Используйте транзакцию
- Удалить из PT
- Пользователь Membership.DeleteUser (MembershipId, правда) - это гарантирует, что пользователь будет удален из ТЕХ членства и других aspnet_ таблиц
- совершают
И это работает, как ожидалось:)
Несколько вещей: User.Identity.Name будет MemberhipId (Guid). Это используется для управления SignIn и Role. Мой PT - это место, где сохраняется информация пользователя (сохранение пароля). Я могу изменять имена пользователей, электронные письма и т. Д., Не влияя на членство или роли, потому что членство основано на PrimaryKey от PT.
Значок требует дополнительного попадания в БД, потому что вам нужно запросить PT, чтобы заставить MemberhipId проверять (вы можете кэшировать).
Встроенная система auth действительно тяжелая - если вы посмотрите на sprocs, вы увидите все обручи, которые она проведет, чтобы проверить пользователя. Я бы рекомендовал в конечном итоге уйти от него. Но в плотном месте это делает хорошую работу - и если у вас нет пользователей milion, я не думаю, что это будет проблемой.
Я не рассматривал OpenId, и я не уверен, как вы его интегрировали, хотя я думаю, что вы, вероятно, могли бы сделать то же самое, что и выше, вместо того, чтобы проверять фактические учетные данные (после того, как они вернутся к проверке формы OpenId) просто войдите в систему с помощью MembershipId (не проверяйте членство).
Для меня основное внимание было уделено тому, что приложение использует пользовательскую модель, позволяющую изменять имя пользователя, адрес электронной почты, имена и т. Д. Без влияния на полномочия и роли. Когда я готов перейти на полную систему, я могу изменить ее, не беспокоясь о влиянии на приложение.