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 4

2 ответа:

Это не порядок столбцов. Я думаю, что вы не настроили свой WebSecurity.InitializeDatabaseConnection должным образом. Похоже, что когда вы добавляете поле электронной почты, оно рассматривается как поле электронной почты (а не естественный ключ для пользователей), и когда вы изменяете логин для использования электронной почты, вы фактически вставляете электронную почту в столбец имя пользователя?

В любом случае, это просто сделать работу. Если у вас уже есть столбец электронной почты в базе данных и вы используете стандартный шаблон интернет-приложения, выполните следующие действия. следующее:
  1. измените модель UserProfile, чтобы добавить свойство Email, Сделайте то же самое с RegisterModel и измените модель Login с UserName на Email
  2. обновите InitializeSimpleMembershipAttribute, чтобы использовать электронную почту вместо UserName в качестве естественного ключа для пользователей
  3. обновить AccountController Login и Register действия, чтобы вы захватили имя пользователя и электронную почту при регистрации, и использовали электронную почту при входе в систему
  4. обновить представления

Итак, фактические изменения, которые необходимо внести являются:

  • Модели / AccountModels.изменения cs
    • class UserProfile: добавьте свойство public string Email { get; set; }
    • class LoginModel: измените имя свойства с UserName на Email
    • 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; } 

Может быть, слишком упрощенно, но это работает для меня.