Пользовательская реализация членства
Я всегда использовал свой собственный код для создания логинов и регистров, но использование членства должно сэкономить мне много времени при программировании этих вещей в моих следующих проектах.
Теперь я нашел много учебных пособий по реализации собственного членства, и некоторые из них сильно отличаются от других. И мне трудно понять, что является лучшим решением для реализации простой пользовательской реализации членства.
Для этого проекта мне просто нужно добавить дополнительную информацию о пользователе, такую как название улицы, почтовый индекс и т. Д.
В настоящее время я сделал это:
public class CustomMembershipUser : MembershipUser
{
public CustomMembershipUser(
string providerName,
string name,
object providerUserKey,
string email,
string passwordQuestion,
string comment,
bool isApproved,
bool isLockedOut,
DateTime creationDate,
DateTime lastLoginDate,
DateTime lastActivityDate,
DateTime lastPasswordChangedDate,
DateTime lastLockoutDate
)
: base(providerName, name, providerUserKey, email, passwordQuestion,
comment, isApproved, isLockedOut, creationDate, lastLoginDate,
lastActivityDate, lastPasswordChangedDate, lastLockoutDate)
{
}
// Add additional properties
public string Streetname { get; set; }
public string Postcode { get; set; }
}
public abstract class CustomMembershipProvider : MembershipProvider
{
public override MembershipUser GetUser(string username, bool userIsOnline)
{
// get data logic
var user = new CustomMembershipUser(
"CustomMembershipProvider",
"naam",
"1",
"adasd@live.com",
"",
"",
true,
false,
DateTime.Now,
DateTime.MinValue,
DateTime.MinValue,
DateTime.MinValue,
DateTime.MinValue) { Streetname = "Test", Postcode = "Test2"};
return user;
}
public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer,
bool isApproved, object providerUserKey, out MembershipCreateStatus status)
{
var user = new CustomMembershipUser(
"CustomMembershipProvider",
"naam",
"1",
"adasd@live.com",
"",
"",
true,
false,
DateTime.Now,
DateTime.MinValue,
DateTime.MinValue,
DateTime.MinValue,
DateTime.MinValue) { Streetname = "Test", Postcode = "Test2" };
status = MembershipCreateStatus.Success;
return user;
}
}
Это лучшее решение для моего пользовательского членства или есть лучшие варианты?
Я еще не проверял это, поэтому я понятия не имею, работает ли это.
Я использую MVC 4.
2 ответа
Первое, что нужно знать о членстве, это то, что оно не имеет ничего общего с Именами, адресами и т. Д. Это касается исключительно идентификаторов пользователей, имен пользователей, паролей и аутентификации. Вот и все. Не пытайтесь расширить его, чтобы добавить имена и адреса, это не то, для чего это нужно.
Вместо этого вы просто создаете свою собственную таблицу "UserProfile" или как хотите, чтобы она называлась. Эта таблица должна быть указана в ключе ProviderUserKey, предоставленном поставщиком членства. Тогда вам нужно только искать все данные, которые вы хотите в своей таблице UserProfile, без необходимости изменять что-либо, связанное с членством.
Таким образом, в вашем случае вы можете использовать стандартный поставщик членства, который имеет ключ GUID. Затем создайте таблицу с именем UserProfile, которая имеет 3 столбца. UserId (уникальный идентификатор), StreetName и PostalCode.
В вашем приложении вы вызываете Membership.GetUser().ProviderUserKey и используете его в качестве ключа для поиска данных в таблице UserProfile. Это быстро, просто и не требует никаких пользовательских изменений в членстве.
В вашем методе AccountController.Register после создания пользователя членства вы также должны создать запись UserProfile с пользователями ProviderUserKey и информацией, которую вы хотите сохранить.
Я предлагаю использовать ASP.NET Identity: http://www.asp.net/identity
Чтобы добавить дополнительные данные поверх того, что IdentityUser
собирать сравнительно легко. Вот таблица пользователя по умолчанию:
- Я бы
- UserName
- PasswordHash
- SecurityStamp
Чтобы добавить данные поверх этого, вы просто наследуете от IdentityUser
:
public class AppUser : IdentityUser
{
// Add additional properties
public string Streetname { get; set; }
public string Postcode { get; set; }
}
Вы можете добавить дополнительные поля по мере необходимости, но MembershipProvider
Насколько я понимаю, это устаревшая система для обработки аутентификации, где ASP.NET Identity гораздо более гибкая и открытая.
Я бы также предложил сместить все дополнительные поля в Profile
класс - просто то, что я нашел намного лучше - заполнить таблицу профилей вместо таблицы пользователей всеми этими различными полями - но я считаю, что это сводится к личным предпочтениям.