ASP.NET: пользовательский MembershipProvider с пользовательской таблицей - PullRequest
3 голосов
/ 21 апреля 2010

Я недавно начал возиться с ASP.NET MVC, но этот вопрос должен относиться и к классическому ASP.NET. Что бы это ни стоило, я мало что знаю о проверке подлинности форм и о членстве в них.

Я пытаюсь написать свой собственный MembershipProvider, который будет связан с моей собственной пользовательской таблицей в моей базе данных. Моя таблица пользователей содержит всю основную информацию о пользователях, такую ​​как имена пользователей, пароли, соли паролей, адреса электронной почты и т. Д., А также такую ​​информацию, как имя, фамилия и страна проживания.

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

Я прочитал в книге "Pro ASP.NET 3.5 в C # 2008", что иметь отдельную таблицу для профилей не очень хорошая идея, если вам нужно много обращаться к таблице профилей и иметь много разных страниц на вашем сайте .

Теперь о проблеме ... Как я уже сказал, я пишу свой собственный подкласс MembershipProvider, и пока он идет довольно хорошо, но теперь я понял, что CreateUser не Я не могу создавать пользователей так, как мне бы хотелось. Метод принимает только фиксированное количество аргументов, и имя, фамилия и страна проживания не являются их частью.

Итак, как мне создать запись для нового пользователя в моей пользовательской таблице без этой информации в CreateUser моего MembershipProvider?

Ответы [ 2 ]

3 голосов
/ 21 апреля 2010

Я думаю, что вы должны продолжить свой подход и добавить новую функцию в вашу реализацию, я имею в виду, перегрузить метод CreateUser и иметь CustomMembershipUser (который расширяет MembershipUser) в качестве параметра. Таким образом, перед использованием провайдера приведите его к вашему CustomMembershipProvider и используйте перегруженный метод.

2 голосов
/ 21 апреля 2010

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

string username = .../ retrieve username here

Membership.CreateUser(username , password, email);

ProfileBase newProfile = Profile.Create(username); //since the user has just been created, all properties will be blank

//set all entered properties
newProfile.SetPropertyValue("MyProp1", myProp1Value);
... 
newProfile.SetPropertyValue("MyPropN", myPropNValue);

newProfile.Save();

Таким образом, вы используете поставщиков членства ASP.NET для создания пользователя и сохранения данных профиля, но для вашего конечного пользователя это отдельная атомарная операция.

...