Simplemembership-добавление поля электронной почты и использование в качестве логина
Я пытаюсь сделать здесь две вещи:
1. Добавление поля электронной почты в таблицу UserProfile (по умолчанию). Работает как заклинание. Пользователи могут зарегистрировать как имя пользователя, так и адрес электронной почты.
2. Измените логин, чтобы использовать электронную почту вместо имени пользователя, это также работает как шарм.
Вот в чем проблема. Вышеизложенное работает только тогда, когда я разделяю их, как только я использую оба из них Процесс регистрации терпит неудачу со следующей ошибкой сообщение:
Cannot insert the value NULL into column 'UserName', table 'opdb.dbo.UserProfile'; column does not allow nulls. INSERT fails.
WebSecurity.CreateUserAndAccount(model.UserName, model.Password, new { Email = model.Email
});
WebSecurity.Login(model.Email, model.Password);
Я более или менее следую руководство найдено здесь , В разделе комментариев я вижу, что другие имеют ту же проблему, однако, решение не состоит в том, чтобы установить поле UserName для разрешения нулей, как указано в ответах.
Самое странное, что все работает до тех пор, пока я не использую оба вместе. Есть идеи? Это сводит меня с ума!Заранее спасибо
Edit : может быть, это порядок столбцов в базе данных? Тот поле, используемое для идентификации, должно быть первым столбцом в таблице? Итак, если я хочу, чтобы электронная почта была идентификатором, который должен быть первым столбцом в таблице?
2 ответа:
Это не порядок столбцов. Я думаю, что вы не настроили свой
В любом случае, это просто сделать работу. Если у вас уже есть столбец электронной почты в базе данных и вы используете стандартный шаблон интернет-приложения, выполните следующие действия. следующее:WebSecurity.InitializeDatabaseConnection
должным образом. Похоже, что когда вы добавляете поле электронной почты, оно рассматривается как поле электронной почты (а не естественный ключ для пользователей), и когда вы изменяете логин для использования электронной почты, вы фактически вставляете электронную почту в столбец имя пользователя?
- измените модель
UserProfile
, чтобы добавить свойствоRegisterModel
и измените модельLogin
сUserName
на- обновите
InitializeSimpleMembershipAttribute
, чтобы использовать электронную почту вместоUserName
в качестве естественного ключа для пользователей- обновить
AccountController
Login
иRegister
действия, чтобы вы захватили имя пользователя и электронную почту при регистрации, и использовали электронную почту при входе в систему- обновить представления
Итак, фактические изменения, которые необходимо внести являются:
- Модели / AccountModels.изменения cs
class UserProfile
: добавьте свойствоpublic string Email { get; set; }
class LoginModel
: измените имя свойства сUserName
наclass RegisterModel
: добавьте свойствоpublic string Email { get; set; }
и установите его атрибуты вRequired
, установитеDisplay(Name
и т. д. (максимальная длина, Если вы хотите применить и этоAccountController
изменения
Login
метод:
- изменить
model.UserName
наmodel.Email
в строкеif (ModelState.IsValid && WebSecurity.Login(model.UserName ...
Register
метод:
- изменить
WebSecurity.CreateUserAndAccount(model.UserName, model.Password);
наWebSecurity.CreateUserAndAccount(model.Email, model.Password, new { UserName = model.UserName });
- EDIT-пропущено изменение: Изменить
WebSecurity.Login(model.UserName, model.Password);
наWebSecurity.Login(model.Email, model.Password);
- Filters/InitializeSimpleMembershipAttribute.изменения cs
- изменить
"UserName"
на"Email"
вWebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
- Просмотры / Учетная Запись / Логин.cshtml
- измените три вида использования
m.UserName
наm.Email
- Просмотры / Учетная Запись / Регистр.cshtml
- скопируйте и вставьте раздел UserName
<li>
и измените дубликатыm.UserName
вm.Email
В проекте vanilla Internet Application MVC 4 эти изменения будут работать идеально (в истинном проекте vanilla вам, возможно, придется применить миграции, если вы хотите использовать их, и вы не редактируете базу данных, чтобы добавить столбец электронной почты).
Я не уверен, что предложение Энди Браунса сработает, потому что WebSecurity в пространстве имен WebMatrix.В результате ссылки на WebData не будут работать корректно. Они специально смотрят на поле имени пользователя, чтобы выполнить свои действия. Я могу ошибаться, но таково мое восприятие. Если вам нужно отдельное поле, создайте другое поле имени пользователя (Name) и запустите свой собственный код, чтобы обновить его для отражения пользователю.
Я решил настроить представление регистрации, переименовав имя Пользователя в адрес электронной почты пользователя
<li> @Html.Label("Email Address:") @Html.TextBoxFor(m => m.UserName) </li>
А затем в модели входа и регистрации просто требуется имя пользователя, введенное в формате электронной почты с использованием:
[Required] [DataType(DataType.EmailAddress)] [EmailAddress] [Display(Name = "UserEmail")] public string UserName { get; set; }
Может быть, слишком упрощенно, но это работает для меня.