Где я могу хранить дополнительные данные пользователя, используя ASP.NET MVC и SqlMembershipProvider?
Итак, я создаю сайт ASP.NET MVC.
Он имеет довольно сложную страницу регистрации пользователей с множеством полей. У меня вопрос, где я должен сохранить это? Таблицы пользователей, созданные инструментом членства, не содержат этих столбцов, и я не понимаю, как лучше хранить эту дополнительную информацию о каждом пользователе?
Это где провайдер профиля вступает в игру? Как они работают? Если нет, то как еще вы сохраните и сохраните дополнительные пользовательские данные, не предоставленные в столбцах запасов таблиц MembershipProvider?
Может кто-нибудь указать мне на некоторые ресурсы о том, как это обрабатывается, как получить доступ к этим дополнительным данным пользователя, когда они мне нужны, как создать нового пользователя со всей этой информацией и т. Д.
4 ответа
Я не совсем уверен, что есть лучшая практика, и это действительно зависит от того, как вы хотите использовать информацию.
Во-первых, вы должны признать членство и профили две разные вещи. Функциональные возможности членства, профиля и роли ASP.NET предназначены для использования в качестве службы, обслуживающей несколько сайтов / приложений.
Если вы посмотрите на схему для этих отношений, вы заметите, что пользователи являются уникальными для системы, но пользователь может совместно использовать приложения. Это означает, что информация их профиля также используется всеми приложениями. Членство на самом деле является ассоциацией пользователя с приложением и содержит информацию об их отношении к этому конкретному приложению (пароль, пароль, вопросы и ответы и т. Д.).
Вы можете использовать провайдера профилей, как предложил Райан, но 1) эту информацию нелегко запрашивать, если вы хотите собрать метрики профиля, и 2) она распределяется среди всех потребителей услуг членства / профилей. Вы можете, однако, расширить его для удовлетворения ваших потребностей.
Вы можете расширить членство провайдера, как предложил Gortok, и эта информация будет относиться к приложению, но вам нужно убедиться, что вы не нарушите существующих потребителей сервиса, изменив существующие хранимые процедуры или таблицы таким образом, чтобы изменить их интерфейс или намерение.
Другой вариант - вы можете обращаться с ним как с сервисом и отслеживать эту информацию самостоятельно, ссылаясь на собственную реализацию профиля, используя идентификатор пользователя от провайдера asp.net sql.
Есть хорошая серия (16 частей) о членстве, профилях и ролях для 4 парней из Rolla, которую я бы рекомендовал прочитать, а затем, как только вы ознакомитесь со всеми движущимися частями, примите обоснованное решение о том, где лучше всего хранить и как лучше структурировать информацию профиля, которую вы хотите создать.
Именно здесь приходит поставщик профилей ASP.NET. Вы можете использовать его для хранения любой информации профиля, которую вы хотите о пользователе. Все, что вам нужно сделать, это добавить нужные поля в файл web.config, ссылка на MSDN, как настроить поля профиля в файле web.config. Чтобы подвести итог статьи, вы просто добавляете значения имени и типа, которые хотите сохранить, в узел свойств элемента профиля. Вот пример:
<profile enabled="true">
<properties>
<add name="Name" />
<group name="Address">
<add name="Street" />
<add name="City" />
<add name="Zip" type="System.Int32" />
</group>
</properties>
</profile>
В ASP.NET Webforms Visual Studio автоматически создает строго типизированный класс профиля, который будет ссылаться на свойства пользовательского профиля. В MVC этого не происходит. Чтобы обратиться к информации профиля пользователя, просто вызовите HttpContext.Profile["PropertyName"]. Пример:
HttpContext.Profile["Name"] = name;
HttpContext.Profile.GetProfileGroup("Address")["Zip"] = zip;
Редактировать: Как заметил Энди, использование SqlProfileProvider по умолчанию не очень хорошо, если вы хотите выполнять запросы к этим свойствам. Он совершенно прав, и, возможно, я должен был изначально отметить это ограничение. Это ограничение существует, поскольку SqlProfileProvider хранит все данные профиля в трех столбцах: PropertyNames и PropertyValuesString/PropertyValuesBinary. Все ключи хранятся в поле PropertyNames, значения, которые могут быть сохранены в виде строки, хранятся в поле PropertyValuesString и т. Д. Это означает, что выполнить запрос типа "Выбрать * из aspnet_Profile, где возраст> 10" чрезвычайно сложно.
Я знаю, что это сообщение было опубликовано в течение длительного времени, и контекст вопроса был, вероятно, для mvc2 или более ранней.
Сейчас mvc3, и я подумал, что, возможно, другие, ищущие ответы для контекста mvc5, могут быть заинтересованы в этом решении.
В стандартном проекте mvc5, в котором включена отдельная учетная запись пользователя, вы найдете следующий блок кода, готовый для использования в {Project}/Models/IdentityModel.cs
// You can add profile data for the user by adding more properties to your ApplicationUser class, please visit http://go.microsoft.com/fwlink/?LinkID=317594 to learn more.
public class ApplicationUser : IdentityUser
{
}
Просто добавьте дополнительные свойства к этому классу, и свойства будут сохранены в базе данных, например.
public class ApplicationUser : IdentityUser
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public bool Active { get; set; }
public DateTime DateRegistered { get; set; }
}